好吧,由于JavaScript是在客户端执行的,我无法控制一堆环境变量,而且在某些时候,我的应用程序可能会抛出异常。
我想要做的是获取此异常并使我的应用程序正常失败并向最终用户显示最大可能信息(我的最终用户是技术用户)。显然,错误处理可以通过一个简单的try ... catch块来完成。
令我烦恼的是:如何知道catch
阻止抓取的原生异常中存储了哪些信息?
我假设浏览器的JS引擎抛出的本机异常只是来自Error
类的对象,就像运行此代码一样:
try {
a;
} catch (ex) {
console.log(ex);
console.log(new ReferenceError("`Custom` error"));
}
我得到了相同的结构:
ReferenceError: a is not defined
at http://stacksnippets.net/js:14:3
ReferenceError: `Custom` error
at http://stacksnippets.net/js:17:15
好吧,普通对象的console.log
略微与此不同,但假设ex
变量是一个对象,我可以通过{循环它{3}},对吧?
嗯,不。
此代码未在日志中显示任何内容:
try {
a;
} catch (ex) {
for (prop in ex) {
console.log(prop, ": ", ex[prop]);
}
}
所以,我的问题是: 如何获取存储在本机JavaScript异常中的所有信息?
是的,我知道我可以通过ex.name
,ex.description
,ex.message
,ex.stack
等直接访问这些属性,但我希望避免这种情况。有些浏览器可以实现其他浏览器没有的东西,所以在第一个浏览器运行时我会遗漏一些信息(正如for...in
所见,stack
属性,例如,首先由Firefox实现。)
而且,如果有人可以解释,我想了解JavaScript异常的真实性质(它们是对象吗?为什么它们在控制台中看起来如此不同?)为什么我不能用它循环呢? for ... in block(可能答案非常相关)。
感谢。
答案 0 :(得分:3)
我想了解JavaScript的真正本质 异常(它们是对象吗?为什么它们看起来如此不同? 控制台?)
Javascript异常是常规的javascript对象。您可以看到对象定义here
为什么我不能用for ... in block循环它(可能是 答案非常相关)。
使用for (prop in ex) {
迭代错误的属性不起作用,因为属性未标记为enumerable(这也通过打印属性描述符显示在下面的代码段中)
您可以切换为使用getOwnPropertyNames列出所有属性。
下面的代码说明了如何使用它 - 不确定是否可以使用getOwnPropertyNames
& {@ 1}}以这种方式,但它是一种可能的解决方案。
ex[property]