好吧,由于 JavaScript 在客户端执行,我无法控制一堆环境变量,并且在某些时候,我的应用程序可能会抛出异常。
我想要做的是获取此异常并使我的应用程序正常失败并向最终用户显示尽可能多的信息(我的最终用户是技术用户)。显然,错误处理可以通过一个简单的 try...catch block 来完成。
令我烦恼的是:我如何知道 catch
捕获的 native 异常中存储了哪些信息?阻止?
我假设浏览器的 JS 引擎抛出的 native 异常只是 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
变量是一个对象,我可以通过 for...in
循环它,对吗?
嗯,不。
此代码在日志中不显示任何内容:
try {
a;
} catch (ex) {
for (prop in ex) {
console.log(prop, ": ", ex[prop]);
}
}
所以,我的问题是: 如何获取存储在 native JavaScript 异常中的所有信息?
是的,我知道我可以通过 ex.name
直接访问属性, ex.description
, ex.message
, ex.stack
等等,但我想避免这种情况。有些浏览器可以实现其他浏览器没有的功能,因此在第一个浏览器中运行时我会丢失一些信息(如 this question 所示,例如 stack
属性首先由 Firefox 实现)。
而且,如果有人可以解释,我想了解 JavaScript 异常的真正本质是什么(它们是对象吗?为什么它们在控制台中看起来如此不同?)以及为什么我不能用for...in block (可能答案非常相关)。
谢谢。
最佳答案
I would like to understand what is the real nature of the JavaScript exceptions (are they objects? why they look so different in the console?)
Javascript 异常是常规的 javascript 对象。可以看到对象定义here
and why can't I loop though it with a for...in block (probably the answers are very related).
使用 for (prop in ex) {
迭代错误的属性不起作用,因为属性未标记为 enumerable (这也通过打印属性描述符显示在下面的代码片段中)
您可以切换为使用getOwnPropertyNames列出所有属性。
下面的代码说明了如何使用它 - 不确定以这种方式使用 getOwnPropertyNames
和 ex[property]
是否可以,但这是一个可能的解决方案.
function propsToStr(obj) {
var str = '';
for (prop in obj) {
str += prop + "=" + obj[prop] + ",";
}
return str;
}
try {
a;
} catch (ex) {
console.log(ex);
var propertyNames = Object.getOwnPropertyNames(ex);
propertyNames.forEach(function(property) {
var descriptor = Object.getOwnPropertyDescriptor(ex, property);
console.log(property + ":" + ex[property] + ":" + propsToStr(descriptor));
});
}
关于javascript - 如何提取 JavaScript native 异常的所有信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30900014/