理解js中的Error
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解js中的Error相关的知识,希望对你有一定的参考价值。
参考技术A通过 Error 构造器我们可以创建一个错误对象,当程序运行出错时,Error的实例对象就会被抛出。
注意 : fileName 和 lineNumber 参数是非标准的api,使用时需要注意其兼容。
除了通用的Error构造函数外, js还有6个其他类型的错误构造函数。
另外 : 还有一个非标准的错误构造函数 IntervalError : js引擎内部的错误, 如递归太多.
在Node.js中, 除了标准的js错误之外, 还有以下几类错误:
所有由 Node.js 引起的 javascript 错误与系统错误都继承自或实例化自标准的 JavaScript <Error> 类,且保证至少提供类中的属性。
在Node.js或某些浏览器环境中可能会包含 code, stack 等信息
Node.js中 : 对于所有的 EventEmitter 对象,如果没有提供一个 \'error\' 事件句柄,则错误会被抛出,并造成 Node.js 进程报告一个未处理的异常且随即崩溃,除非: 适当地使用 domain 模块或已经注册了一个 [ process.on(\'uncaughtException\') ] 事件的句柄。
记录捕获的错误与 Node.js 中的未捕获错误完全相同
【中文标题】记录捕获的错误与 Node.js 中的未捕获错误完全相同【英文标题】:Logging caught errors exactly the same as uncaught errors in Node.js 【发布时间】:2016-02-27 17:37:01 【问题描述】:假设我有以下文件error.js
:
// this is invalid code
var a: 0;
然后在我的main.js
中我需要那个文件:
require("./error.js");
我从 Node.js 收到了一条漂亮、简单且易于理解的错误消息:
$ node main.js
/home/jfischer/error.js:2
var a: 0;
^
SyntaxError: Unexpected token :
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:413:25)
at Object.Module._extensions..js (module.js:452:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object.<anonymous> (/home/jfischer/main.js:1:63)
at Module._compile (module.js:434:26)
at Object.Module._extensions..js (module.js:452:10)
现在让我们尝试将其包装在 try/catch 块中,并通过将 main.js
更改为:
try
require("./error.js");
catch(err)
console.log(err.stack);
但现在我们得到:
$ node main.js
SyntaxError: Unexpected token :
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:413:25)
at Object.Module._extensions..js (module.js:452:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object.<anonymous> (/home/jfischer/main.js:3:5)
at Module._compile (module.js:434:26)
at Object.Module._extensions..js (module.js:452:10)
如何获得更人性化的部分,指出字符串中节点中断的确切文件和代码行?:
var a: 0;
^
Node.js documentation 似乎没有暴露除stack
属性之外的任何内容; message
和 name
不太有用。
我对将错误记录到文件或其他自定义错误记录解决方案感兴趣。任何帮助将不胜感激。
【问题讨论】:
谈谈时机。实现此修复的第一步仅在两小时前交付。 github.com/nodejs/node/pull/4013. 【参考方案1】:使用 Node.js 4 运行代码时缺少该信息,但在 Node.js 6 及更高版本中,即使发现错误,也会提供有用的信息。 Node.js 4 不再受支持,我想此时您不再使用它了。但如果您或任何人:使用 Node.js 6 或更高版本,您将获得所需的信息。
$ nvm use 4
Now using node v4.9.1 (npm v2.15.11)
$ node -v
v4.9.1
$ node main.js
SyntaxError: Unexpected token :
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:373:25)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (/Users/trott/temp/main.js:2:1)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
$ nvm use 6
Now using node v6.15.1 (npm v3.10.10)
$ node -v
v6.15.1
$ node main.js
/Users/trott/temp/error.js:2
var a: 0;
^
SyntaxError: Unexpected token :
at createScript (vm.js:56:10)
at Object.runInThisContext (vm.js:97:10)
at Module._compile (module.js:549:28)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/trott/temp/main.js:2:1)
$
【讨论】:
【参考方案2】:最新的节点 v11 显示了导入模块的所有细节。
【讨论】:
以上是关于理解js中的Error的主要内容,如果未能解决你的问题,请参考以下文章