我想编写一个通用的错误处理程序,它将捕获在代码的任何实例中故意抛出的自定义错误。
当我抛出新的错误('sample'),如下所示
try {
throw new Error({'hehe':'haha'});
// throw new Error('hehe');
} catch(e) {
alert(e);
console.log(e);
}
日志在Firefox中显示为错误:[object object],我无法解析该对象。
对于第二次抛出,日志显示为:错误:呵呵
然而当我这样做的时候
try {
throw ({'hehe':'haha'});
} catch(e) {
alert(e);
console.log(e);
}
控制台显示为:对象{hehe="haha"},我可以在其中访问错误属性。
有什么不同?
区别是否如代码中所示?比如字符串会作为字符串传递而对象作为对象但语法会有所不同?
我还没有探索过抛出错误对象…我只抛出了字符串。
除了以上两种方法,还有别的办法吗?
的反应行为
除了其他的答案,我还想说明React的一个不同之处。
如果我抛出一个新的Error(),并且我处于开发模式,我将得到一个错误屏幕和一个控制台日志。如果我抛出一个字符串字面量,我只会在控制台中看到它,如果我没有观察控制台日志,可能会错过它。
例子
在开发模式下向控制台抛出错误日志并显示错误屏幕(在生产环境中不可见)。
throw new Error("The application could not authenticate.");
而下面的代码只能登录到控制台:
throw "The application could not authenticate.";
TLDR:它们是等价的Error(x) === new Error(x)。
// this:
const x = Error('I was created using a function call!');
// has the same functionality as this:
const y = new Error('I was constructed via the "new" keyword!');
来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
throw和throw Error函数是等价的。但是当你捕获它们并将它们序列化到console.log时,它们的序列化方式并不完全相同:
throw 'Parameter is not a number!';
throw new Error('Parameter is not a number!');
throw Error('Parameter is not a number!');
Console.log(e)将产生2个不同的结果:
Parameter is not a number!
Error: Parameter is not a number!
Error: Parameter is not a number!