我想编写一个通用的错误处理程序,它将捕获在代码的任何实例中故意抛出的自定义错误。
当我抛出新的错误('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"},我可以在其中访问错误属性。
有什么不同?
区别是否如代码中所示?比如字符串会作为字符串传递而对象作为对象但语法会有所不同?
我还没有探索过抛出错误对象…我只抛出了字符串。
除了以上两种方法,还有别的办法吗?
Error构造函数用于创建错误对象。发生运行时错误时抛出错误对象。Error对象还可以用作用户定义异常的基对象。
用户定义错误通过throw语句抛出。程序控制将被传递给调用堆栈中的第一个catch块。
有和没有error对象时抛出错误的区别:
throw {'hehe':'haha'};
在chrome中,devtools是这样的:
Chrome告诉我们,我们有一个未捕获的错误,这只是一个JS对象。对象本身可能有关于错误的信息,但我们仍然不知道它来自哪里。在我们处理代码和调试它的时候,这不是很有用。
throw new Error({'hehe':'haha'});
在chrome中,devtools是这样的:
与error对象一起抛出的错误在展开堆栈时提供堆栈跟踪。这为我们提供了有价值的信息,错误准确地来自哪里,这在调试代码时通常是有价值的信息。进一步注意,错误说的是[object object],这是因为error构造函数期望一个消息字符串作为第一个参数。当它接收到一个对象时,它会将其强制转换为一个字符串。
Error构造函数用于创建错误对象。发生运行时错误时抛出错误对象。Error对象还可以用作用户定义异常的基对象。
用户定义错误通过throw语句抛出。程序控制将被传递给调用堆栈中的第一个catch块。
有和没有error对象时抛出错误的区别:
throw {'hehe':'haha'};
在chrome中,devtools是这样的:
Chrome告诉我们,我们有一个未捕获的错误,这只是一个JS对象。对象本身可能有关于错误的信息,但我们仍然不知道它来自哪里。在我们处理代码和调试它的时候,这不是很有用。
throw new Error({'hehe':'haha'});
在chrome中,devtools是这样的:
与error对象一起抛出的错误在展开堆栈时提供堆栈跟踪。这为我们提供了有价值的信息,错误准确地来自哪里,这在调试代码时通常是有价值的信息。进一步注意,错误说的是[object object],这是因为error构造函数期望一个消息字符串作为第一个参数。当它接收到一个对象时,它会将其强制转换为一个字符串。
下面的文章可能会更详细地说明哪个是更好的选择;throw 'An error'或throw new error ('An error'):
http://www.nczonline.net/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/
它表明后者(new Error())更可靠,因为像Internet Explorer和Safari(不确定版本)这样的浏览器在使用前者时不能正确地报告消息。
这样做将导致抛出错误,但并非所有浏览器都以您期望的方式响应。Firefox, Opera和Chrome都显示一个“未捕获的异常”消息,然后包含消息字符串。Safari和Internet Explorer只是抛出一个“未捕获的异常”错误,根本不提供消息字符串。显然,从调试的角度来看,这是次优的。
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!