在抛出的对象中传递错误原因/如何处理现代JavaScript中的错误

我正在开发一个包含parsing器的小型Node.js包。 它一旦发现不可恢复的问题就会抛出。

我已经使用了Java多年,我已经习惯了大量的exception类。

但是这是JavaScript。 我想这是一个风格问题。 我的根本问题是如何通过错误原因赶上块。 我考虑为不同的错误原因创build不同的错误“类”,每个错误都关注每个问题的细节,或者将一个错误类作为属性来保存原因。

让我给你一个处理这两种错误的例子:

catch(e) { if(e instanceof FirstError) { ... } if(e instanceof SecondError) { ... } } catch(err) { if(err instanceof AnError) { if(err.detail === 'becauseOfA') { ... } if(err.detail === 'becauseOfB') { ... } } ... } 

哪种方法比较好? 两者都可以工作,但我不喜欢第一个。 在我看来,许多课程都像一个巨大的开销。

编辑:
我同意使用callback(也在这里回答):

 // 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') { ... } ... } } 

问题依然存在:我应该删除所有的类,并使用一个简单的对象没有任何原型inheritance? 我需要将错误信息传递给error handling程序(无论是catch还是callback)。

我想保持这个function同步,因为它是微小和快速(是的,我知道一个callback不会使一个函数asynchronous)。 AFAIK Node.js自身在同步代码(fs.readFileSync)中引发错误,同时将错误对象传递给asynchronous函数(fs.readFile)中的callback函数。

我认为,节点的最佳方法是以callback式重写模块。 虽然你应该传递callback两个参数:第一个是错误或null(如果操作成功完成),第二个是操作的结果(如果发生错误,则为null或undefined)。

比你可以简单地在你的callback中处理它们。 你可以将错误作为string传递,然后只是case(错误)来处理不同的情况。

UPD:

对于同步方法,你可以使用抛出,但你也可以抛出只是string,然后切换它们。 如果你想让你的types错误(例如,如果方法可能会抛出非常不同的错误(在Java代码中它们可能被描述在不同的类中)),你可以使用像这样的对象:{error:'error_name',type:'error_type '}。

然后切换(err.type),切换(err.error)。

在Javascript中使用类不是最好的方法,因为它只是创build带有原型属性的对象,指向构造函数对象,并且比较指针。