【问题标题】:javascript exception object formatjavascript异常对象格式
【发布时间】:2013-08-18 10:33:12
【问题描述】:

默认情况下,当找不到文件时,Node.js 会抛出以下异常。

{ [Error: ENOENT, no such file or directory 'InvalidFile']
  errno: 34,
  code: 'ENOENT',
  path: 'InvalidFile',
  syscall: 'open' }

从技术上讲,这应该是一个 JavaScript 对象。根据 javascript 对象语义,应该有一个逗号来分隔成员元素。在这种情况下,[Error: ENOENT, no such file or directory 'InvalidFile']errno: 34, 之间没有逗号。我的问题是

  1. 如何构造这样的对象?

  2. 如何访问 [Error: ENOENT, no such file or directory 'InvalidFile']元素 在程序中?

【问题讨论】:

  • 官方的JavaScript异常对象Error有很多用于特定目的的构造函数,比如SyntaxError。 Error 的标准属性包括message(错误消息)、name(错误名称)和(在某些平台上)stack(包含堆栈跟踪)。

标签: javascript node.js exception object


【解决方案1】:

嗯,它不完全是代码。它基于 JavaScript 的文字语法,但只是从util.inspect()(或类似的内部函数)生成的对象的表示。

方括号在message 之前提到了Error类型。而且,剩下的就是一个可枚举属性的列表以及添加到其中的值。

自己创建:

var error = new Error("ENOENT, no such file or directory 'InvalidFile'");
error.errno = 34;
error.code = 'ENOENT';
error.path = 'InvalidFile';
error.syscall = 'open'

console.log(error);               // uses `util.inspect()`
console.log(util.inspect(error)); // or use it directly

console.log(error.message); // "ENOENT, no such ..."
console.log(Object.prototype.toString.call(error)); // "[object Error]"

并且,对于更大的格式示例,请尝试记录一些内置模块:

console.log(console);
{ log: [Function],
  info: [Function],
  warn: [Function],
  error: [Function],
  dir: [Function],
  time: [Function],
  timeEnd: [Function],
  trace: [Function],
  assert: [Function],
  Console: [Function: Console] }

【讨论】:

  • 我使用throw Error(,没有new,它仍然有效。你能告诉我它为什么有效吗?
  • @thefourtheye 那是因为Error injects the new for you
【解决方案2】:

我正在回答子问题 #2。公认的答案虽然很好,但似乎忽略了它。

在 Node 上,[Error: ...] 元素可以作为异常对象上的 .stack 访问。它是一个字符串,然后您可以使用正则表达式对其进行解析以获取例如模块和行号。

例如,您可以像这样解析第一个堆栈帧:

...
} catch (e) {
    var msg, file, line, col;
    [msg,file,col] = e.stack.match(/\((.*):(\d+)\)/);
    if (file) {
        [,file,line] = file.match(/(.*):(\d+)/);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2020-10-11
    • 2023-03-28
    • 1970-01-01
    • 2012-02-22
    • 2018-04-02
    相关资源
    最近更新 更多