JavaScript中的“抛出新警告”?

Posted

技术标签:

【中文标题】JavaScript中的“抛出新警告”?【英文标题】:"throw new Warning" in JavaScript? 【发布时间】:2011-07-08 11:25:50 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

像这样:

console.warn('Hi!');

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

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

要解决此问题,您可以包含 Firebug Lite,或制作一个伪造的 NOP-ing console 对象。

【讨论】:

附带说明,是否可以创建一个函数来替换console.warn('text');return?因此,基本上可以创建一个函数,在调用函数的地方充当return 语句吗? @pim:不;那是不可能的。你可以警告一下,throw 的东西(不一样)。 警告不应影响程序流程。 如果您尝试在没有暴露控制台的浏览器中发出警告,则会引发适当的错误,在 ie6 中会导致弹出窗口。使用这个:function warn(a) console&&console.warn&&console.warn(a); 在大多数情况下,您应该避免使用.warn(),它是非标准:developer.mozilla.org/en-US/docs/Web/API/Console/warn【参考方案2】:

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

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

edit 多年来,这引起了一些反对意见,因此我将扩展答案。 OP 明确询问“我也可以发出警告吗?”如果你有一个“警告”构造函数,答案可能是“是”:

function Warning(msg) 
  this.msg = msg;

那你当然可以

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

当然可以,但和

没有太大区别
if (somethingIsWrong())
  throw "Something is wrong!";

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

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

【讨论】:

【参考方案3】:

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

另外,你最好这样做......

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

无论如何,根据 Crockford 的说法:P

【讨论】:

您必须以 ex.name 或 ex.message 的形式访问属性 哦,对不起,其实还是挺有用的。 这个怎么样? throw (Error ("o my")) @Logan 你也可以这样做。【参考方案4】:

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

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

因为console.logconsole.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)

【讨论】:

如果没有console 对象,此代码将抛出错误“未定义控制台”。你应该写(window.console ? ... 为什么不用function() 而不是function (m) return m; ) 这给了我一个非法调用警告,try/catch 应该工作得更好(我使用function(message) try console.warn(message); catch(e) try console.log(message); catch(e) 作为函数 @Campbeln - 好点。就像“更优化”是矛盾的说法一样。然而,对“更好”可能有一些合理的解释——例如“7 比 5 好”和“10 比 5 好”。但是 10 是“更好”;)【参考方案5】:

使用console.warn(...);

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

【讨论】:

更好的是,做window.console&&console.warn(...) 不,我不认为这更好。如果您的应用程序调试繁重(好吧,对于不太可能的警告),它最终会成为大量重复代码【参考方案6】:

以防万一有人在多年后仍然像我现在一样在寻找,我想指出,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):-(

【讨论】:

以上是关于JavaScript中的“抛出新警告”?的主要内容,如果未能解决你的问题,请参考以下文章

怎么实现javascript中调用java类中的方法

如何检测企业 Java 项目(Java + JSP + Javascript)中的死代码?

Javascript 中的类和对象

如何防止java中的javascript注入

JavaScript 和 jQuery 中的 Java 式 OOP 失败

javascript中的java JSON对象