在JavaScript中“抛出新警告”?

时间:2011-03-04 00:09:49

标签: javascript error-handling throw

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

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

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

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

错误使Chrome的开发者工具显示红叉,但如何让它显示警告图标(黄色感叹号)?

6 个答案:

答案 0 :(得分:69)

像这样:

console.warn('Hi!');

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

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

要解决此问题,您可以加入Firebug Lite,或伪造NOP-ing console对象。

答案 1 :(得分:4)

使用console.warn(...);

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

答案 2 :(得分:4)

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

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

我在我的项目中做了类似的事情,因为console.log得到的支持比console.warn更广泛。

如果你忘了它并将它发送到生产(which is non-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)

答案 3 :(得分:3)

没有“警告”例外。当你抛出一个物体(并且你可以扔掉很多任何东西)时,这是一个被捕获或不捕获的例外。

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

编辑多年来这引起了一些人的反对,所以我将扩大答案。 OP明确要求“我是否也可以发出警告?”如果您有“警告”构造函数,那么答案可能是“是”:

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

然后你当然可以

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

当然,这会奏效,但与

并无太大差别
if (somethingIsWrong())
  throw "Something is wrong!";

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

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

答案 4 :(得分:3)

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

另外,你最好还是做...

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

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

答案 5 :(得分:1)

以防万一,像我现在一样,这几年以后仍然有人在搜索,我想指出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给予了正确的答案,但仍然值得全凭,我只是在补充文档和示例

P.S。抱歉,Pointy,我什至没有足够的声誉来支持你(13/15):-(