javascript - 如何提取 JavaScript native 异常的所有信息?

标签 javascript exception

好吧,由于 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列出所有属性。

下面的代码说明了如何使用它 - 不确定以这种方式使用 getOwnPropertyNamesex[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/

相关文章:

Javascript 单选按钮分组

javascript - 如何在 native react 中停止 setInterval

java - 是否应该允许 GET 请求触发异常?

Javascript:REST API Mongodb 未在 Postman 上连接

javascript - 滚动时固定/取消固定 Div

javascript - AJAX POST 请求未在 post 路由中调用 Controller 方法

c++ - 类的构造函数中的异常处理行为

Java 文件 channel 异常

python - 从异常中获取数据

python - 在设计 Python API 时,抛出异常或返回 false/None 等是否更 Pythonic?