在抛出的对象中传递错误原因/如何处理现代JavaScript中的错误
Pass error reason in thrown object / How to handle errors in modern JavaScript
我正在开发一个包含解析器的小Node.js包。一旦检测到不可恢复的问题,它就会抛出。
我已经使用Java很多年了,我已经习惯了大量的异常类。
但这是JavaScript。我想这是风格的问题。我的主要问题是如何传递错误原因来捕获块。我想为不同的错误原因创建不同的Error"类",每个类负责每个问题的细节,或者创建一个单独的Error类,将原因作为属性。
让我给你一个处理这两种错误的例子:
catch(e) {
if(e instanceof FirstError) {
...
}
if(e instanceof SecondError) {
...
}
}
catch(err) {
if(err instanceof AnError) {
if(err.detail === 'becauseOfA') {
...
}
if(err.detail === 'becauseOfB') {
...
}
}
...
}
哪一种方法更好?两种都可以,但我不喜欢第一种。在我看来,许多类的开销很大。
编辑:
我同意使用回调(也在这里回答):
// One class per error type
function(err, ast) {
if(err) {
if(err instanceof FirstError) {
...
}
if(err instanceof SecondError) {
...
}
}
...
}
// One class for all errors
function(err, ast) {
if(err) {
if(err instanceof AnError) {
if(err.detail === 'becauseOfA') {
...
}
if(err.detail === 'becauseOfB') {
...
}
}
...
}
}
// No class at all
function(err, ast) {
if(err) {
if(err.detail === 'becauseOfA') {
...
}
if(err.detail === 'becauseOfB') {
...
}
...
}
}
问题仍然存在:我应该放弃所有类并使用一个没有任何原型继承的简单对象吗?我需要将有关问题的信息传递给错误处理程序(无论是捕获还是回调)。
我想让这个函数保持同步,因为它很小而且很快(是的,我知道回调不会使函数异步)。AFAIK Node.js本身在同步代码(fs.readFileSync)中抛出错误,同时将错误对象传递给异步函数(fs.readFile)的回调。
我认为,node最好的方法是用回调风格重写模块。虽然应该给回调函数传递两个参数:第一个是error或null(如果操作成功完成),第二个是操作的结果(如果发生错误,则为null或undefined)。
你可以简单地在回调中处理它们。您可以将错误作为字符串传递,然后使用case(error)来处理不同的情况。
乌利希期刊指南:
对于同步方法,你可以使用抛出,但你也可以只抛出字符串,然后切换它们。如果你想对你的错误进行类型化(例如,如果方法可能抛出非常不同的错误(在Java代码中它们可能在不同的类中描述)),你可以使用这样的对象:{error: 'error_name', type: 'error_type'}。
然后切换(err.type),切换(err.error)。
在Javascript中使用类并不是最好的方法,因为它只是简单地创建具有prototype属性的对象,指向构造函数对象,然后instaceof比较这些指针。
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- javascript:如何在antlr生成的Lexer中进行错误处理
- 处理浮点错误的最佳方法是什么
- 生成pdf或其他非html文件时的错误处理
- 处理JSON字符串会导致JavaScript错误
- 是否存在Javascript Liferay Service库的文档?如何处理错误情况
- sailsjs在创建两个模型时的错误处理
- 错误“;未处理'错误'事件“;在运行yo发电机之后
- 尝试在 Google 地图上映射点并收到错误(未处理的异常)
- $.ajax 解析器错误时处理包含新 Date() 元素的 JSON
- 承诺拒绝错误 - 未处理的拒绝错误:已关闭
- Requirejs带有Knockout错误:无法处理绑定“;组件:函数(){return f}"-匿名定义()
- 节点/请求错误:“;处理POST请求:无内容类型”;
- 如何在AngularJs中使用ngView加载视图内容时为http错误定义处理程序
- 删除错误-无法处理绑定“foreach”
- 当尝试升级到最新的happi .js (9.x)时,我们得到:错误:未知处理程序:目录
- IE8淘汰错误-无法处理绑定
- 承诺错误/异常处理设计
- 从JavaScript错误事件处理程序获取更多详细信息
- Broswers& # 39;JS错误的处理