在JavaScript中“抛出新警告”?

问题描述 投票:41回答:6

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

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

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

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

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

javascript error-handling throw
6个回答
72
投票

像这样:

console.warn('Hi!');

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

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

要解决这个问题,你可以包括Firebug Lite,或制作一个假的NOP-ing console对象。


4
投票

使用console.warn(...);

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


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
投票

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

另外,你最好做...

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

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


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()是正确的,但当然这与扔东西并不相同;它只是一条日志消息。执行继续,如果后续代码无法处理触发警告的情况,它仍然会失败。


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仍有充分的信用,我只是补充了文档和示例

附:对不起Pointy,我甚至没有足够的声誉来赞助你(13/15):-(

© www.soinside.com 2019 - 2024. All rights reserved.