pim*_*vdb 44 javascript error-handling throw
目前我正在通过错误处理扩展我的JavaScript项目.该throw
声明在这里发挥了重要作用:
throw new Error("text"); // Error: text
Run Code Online (Sandbox Code Playgroud)
但是,我还可以发出警告吗?我尝试了以下无济于事:
throw new Warning("text"); // Warning is not defined
Run Code Online (Sandbox Code Playgroud)
错误使Chrome的开发人员工具显示红叉,但如何让它显示警告图标(黄色感叹号)?
SLa*_*aks 74
像这样:
console.warn('Hi!');
Run Code Online (Sandbox Code Playgroud)
请注意,与异常不同,这不会中断您的代码; 调用函数将继续正常.
另请注意,除了带有Firebug的WebKits或Firefox之外,这将在任何浏览器中引发错误,因为console
不存在.
要解决这个问题,您可以包含Firebug Lite,或制作假的NOP console
对象.
没有“警告”异常之类的东西。当你抛出一个对象(你几乎可以抛出任何东西)时,它是一个异常,要么被捕获,要么不被捕获。
您可以通过确保代码拦截来自代码内部的异常,以某种方式(通过类型或鸭子类型)寻找“警告”对象来实现警告效果。
编辑这多年来吸引了一些反对票,所以我将扩大答案。OP明确询问“我也可以发出警告吗?” 如果您有一个“警告”构造函数,那么答案可能是“是”:
function Warning(msg) {
this.msg = msg;
}
Run Code Online (Sandbox Code Playgroud)
那你当然可以
if (somethingIsWrong())
throw new Warning("Something is wrong!");
Run Code Online (Sandbox Code Playgroud)
当然,这会奏效,但它与
if (somethingIsWrong())
throw "Something is wrong!";
Run Code Online (Sandbox Code Playgroud)
当你扔东西时,它们可以是任何东西,但有用的东西是 Error 实例,因为它们带有堆栈跟踪。在任何情况下,要么有一个catch
声明,要么没有,但浏览器本身不会关心你抛出的对象是一个Warning
实例。
正如其他答案所指出的那样,如果真正的目标只是影响控制台输出,那么它console.warn()
是正确的,但当然这与扔东西没有可比性;这只是一条日志消息。继续执行,如果后续代码无法处理触发警告的情况,它仍然会失败。
我认为您不能在 JavaScript 中发出警告。
另外,你最好这样做......
throw {
name: 'Error',
message: 'Something error\'d'
}
Run Code Online (Sandbox Code Playgroud)
根据克罗克福德的说法,无论如何:P
为了安全起见,您可以这样做:
(console ? (console.warn || console.log) : function (m) { return m; })
("warning text goes here")
;
Run Code Online (Sandbox Code Playgroud)
我在我的项目中做了类似的事情,因为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) {}
}
}
Run Code Online (Sandbox Code Playgroud)
效果更好(感谢@Solomon Ucko)
小智 5
以防万一有人在几年后仍然像我现在一样寻找这一点,我想指出的是,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
}
Run Code Online (Sandbox Code Playgroud)
完全归功于 Pointy 给出了(未确认的)正确答案,我只是补充了文档和示例
PS 抱歉 Pointy,我什至没有足够的声誉来支持你 (13/15) :-(