60

目前我正在使用错误处理扩展我的 JavaScript 项目。该throw声明在这里发挥着重要作用:

throw new Error("text"); // Error: text

但是,我也可以发出警告吗?我尝试了以下方法无济于事:

throw new Warning("text"); // Warning is not defined

这些错误使 Chrome 的开发者工具显示一个红十字,但我怎样才能让它显示一个警告图标(黄色感叹号)?

4

6 回答 6

90

像这样:

console.warn('Hi!');

请注意,与异常不同,这不会中断您的代码;调用函数将正常继续。

另请注意,这将在除 WebKits 或带有 Firebug 的 Firefox 之外的任何浏览器中引发错误,因为console它不存在。

要解决这个问题,您可以包含Firebug Lite,或制作一个假的 NOP-ingconsole对象。

于 2011-03-04T00:13:42.397 回答
7

没有“警告”异常之类的东西。当你抛出一个对象时(你几乎可以抛出任何东西),它是一个被捕获或未被捕获的异常。

您可以通过确保您的代码拦截来自代码内部的异常,以某种方式(按类型或通过鸭子类型)查找“警告”对象来实现警告效果。

编辑多年来,这吸引了一些反对票,所以我将扩大答案。OP明确询问“我也可以发出警告吗?” 如果你有一个“警告”构造函数,答案可能是“是”:

function Warning(msg) {
  this.msg = msg;
}

那你当然可以

if (somethingIsWrong())
  throw new Warning("Something is wrong!");

当然,这会起作用,但它与

if (somethingIsWrong())
  throw "Something is wrong!";

当你扔东西时,它们可以是任何东西,但有用的东西是 Error 实例,因为它们带有堆栈跟踪。在任何情况下,要么有一个catch语句,要么没有,但浏览器本身并不关心你抛出的对象是一个Warning实例。

正如其他答案所指出的那样,如果真正的目标只是影响控制台输出,那么console.warn()是正确的,但当然这与扔东西并不能真正相提并论;这只是一条日志消息。继续执行,如果后续代码无法处理触发警告的情况,仍然会失败。

于 2011-03-04T00:11:41.883 回答
5

我认为您不能在 JavaScript 中发出警告。

另外,你最好做...

throw {
   name: 'Error',
   message: 'Something error\'d'
}

根据克罗克福德的说法,无论如何:P

于 2011-03-04T00:11:47.003 回答
5

为了安全起见,您可以这样做:

(console ? (console.warn || console.log) : function (m) { return m; })
    ("warning text goes here")
;

我在我的项目中做了类似的事情,因为console.log它比console.warn.

如果您确实忘记了它并将其发送到生产环境(即非 muy-bueno),匿名函数会吃掉它。

编辑:

var notConsole = {
    log: function() {
        try {
            console.log.apply(this, arguments);
        } catch(e) {}
    },
    warn: function() {
        try {
            console.warn.apply(this, arguments);
        } catch(e) {}
    }
}

效果更好(感谢@Solomon Ucko)

于 2014-10-28T03:52:56.197 回答
4

采用console.warn(...);

请注意,它仅在有控制台时才定义 - 例如,仅在 FireBug 处于活动状态时才在 Firefox 中定义。因此,如果您使用它,请不要忘记使用您使用的方法创建一个虚拟控制台对象,如果window.console未定义。

于 2011-03-04T00:15:20.573 回答
3

以防万一有人像我现在一样在几年后仍在寻找,我想指出,Pointy 的(正确)答案是让我找到问题答案的原因:我可以抛出一个自定义的“警告”吗目的?

Pointy 指出,“你几乎可以扔任何东西”,这让我找到了以下文档throw

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw

摘录:

// Syntax
throw expression; // expression to throw

// Examples
throw 'Error2'; // generates an exception with a string value
throw 42;       // generates an exception with the value 42
throw true;     // generates an exception with the value true
throw new Error('Required');  // generates an error object with the message of Required

// Throw an object - you can specify an object when you throw an exception. You can then reference the object's properties in the catch block. The following example creates an object of type UserException and uses it in a throw statement.

// Example
function UserException(message) {
   this.message = message;
   this.name = 'UserException';
}
function getMonthName(mo) {
   mo = mo - 1; // Adjust month number for array index (1 = Jan, 12 = Dec)
   var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',
      'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
   if (months[mo] !== undefined) {
      return months[mo];
   } else {
      throw new UserException('InvalidMonthNo');
   }
}

try {
   // statements to try
   var myMonth = 15; // 15 is out of bound to raise the exception
   var monthName = getMonthName(myMonth);
} catch (e) {
   monthName = 'unknown';
   console.log(e.message, e.name); // pass exception object to err handler
}

完全归功于 Pointy 给出了(未确认的)正确答案,我只是在补充文档和示例

PS对不起Pointy,我什至没有足够的声誉来支持你(13/15):-(

于 2019-03-14T21:23:04.723 回答