&引用;抛出新警告“;用JavaScript?

&引用;抛出新警告“;用JavaScript?,javascript,error-handling,throw,Javascript,Error Handling,Throw,目前,我正在用错误处理扩展我的JavaScript项目。throw语句在这里起着重要作用: throw new Error("text"); // Error: text 不过,我也可以提出警告吗?我尝试了以下方法,但无效: throw new Warning("text"); // Warning is not defined 这些错误使Chrome的开发工具显示一个红色的十字,但我如何才能使它显示一个警告图标(黄色感叹号)?没有“警告”例外。当你抛出一个对象时(你几乎可以抛出任何东西),

目前,我正在用错误处理扩展我的JavaScript项目。
throw
语句在这里起着重要作用:

throw new Error("text"); // Error: text
不过,我也可以提出警告吗?我尝试了以下方法,但无效:

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

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

没有“警告”例外。当你抛出一个对象时(你几乎可以抛出任何东西),它是一个异常,要么被捕获,要么不被捕获

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

编辑这几年来吸引了一些反对票,所以我将详细介绍答案。OP明确地问:“我也可以抛出警告吗?”如果你有一个“警告”构造函数,答案可能是“是”:

function Warning(msg) {
  this.msg = msg;
}
那你当然可以

if (somethingIsWrong())
  throw new Warning("Something is wrong!");
当然,这会管用,但和你的想法没什么不同

if (somethingIsWrong())
  throw "Something is wrong!";
当您抛出对象时,它们可以是任何对象,但要抛出的有用对象是错误实例,因为它们带有堆栈跟踪。在任何情况下,可能会有一个
catch
语句,也可能没有,但浏览器本身不会在意抛出的对象是否是
警告
实例


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

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

另外,你最好做

throw {
   name: 'Error',
   message: 'Something error\'d'
}
根据Crockford的说法,无论如何:p

像这样:

console.warn('Hi!');
请注意,与异常不同,这不会中断代码;调用函数将正常继续

还请注意,这将在除Webkit或Firefox with Firebug之外的任何浏览器中引发错误,因为
控制台
将不存在

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

使用
console.warn(…)


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

为了安全起见,您可以执行以下操作:

(console ? (console.warn || console.log) : function (m) { return m; })
    ("warning text goes here")
;
我在我的项目中也做了一些类似的事情,因为它得到了比以前更广泛的支持

如果您确实忘记了它并将其发送到production(),匿名函数将吃掉它

编辑:


工作得更好(感谢@Solomon Ucko)

如果有人像我现在这样在这几年后仍在搜索,我想指出的是,Pointy(正确)的答案正是我找到问题答案的原因:我可以抛出一个自定义的“警告”对象吗

Pointy指出,“你几乎可以抛出任何东西”,这让我找到了
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给出了(未确认的)正确答案,我只是补充了一些文档和示例


顺便说一句,对不起,我甚至没有足够的声誉来支持你(13/15):-(

你必须以ex.name或ex.message的形式访问属性哦,对不起,它实际上相当有用。这个怎么样?
抛出(错误(“我的”))
@Logan您也可以这样做。顺便问一下,是否可以创建一个函数来替换
控制台。warn('text')呢;return
?基本上,我们能够在调用函数的地方创建一个充当
return
语句的函数吗?@pim:不,这是不可能的。您可以发出警告,
抛出一些东西(这不一样).warning不应影响程序流。如果您尝试在未暴露控制台的浏览器中发出警告,则会在ie6中引发一个适当的错误,从而导致弹出窗口。使用以下函数:warn(a){console&&console.warn&&console.warn(a);}。在大多数情况下,应避免使用
.warn()
它是非标准的:更好的是,执行
窗口.控制台和&console.warn(…)
不,我不认为这样更好。如果应用程序调试繁重(好的,对于不太可能出现的警告),则会导致大量重复代码。如果没有
控制台
对象,此代码将抛出错误“控制台未定义”。您应该编写
(window.console?…
为什么不使用
函数(){}
而不是
函数(m){return m;})
?这给了我一个非法调用警告,try/catch应该工作得更好(我正在使用
函数(message){try{console.warn(message);}catch(e){try{console.log(message);}catch(e){}}
作为function@Campbeln-好的观点。就像“更优”是一个矛盾修饰法。然而,对“更好”可能有一些合理的解释——例如“7比5好”和“10比5好”。但10是“更好”;)
// 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
}