我正在开发一个包含解析器的小型 Node.js 包。一旦检测到不可恢复的问题,它就会抛出。
我使用 Java 已经有很多年了,我已经习惯了大量的异常类。
但这是 JavaScript。我想这是风格问题。我的基本问题是如何传递错误原因来捕获块。我想为不同的错误原因创建不同的错误“类”,每个错误“类”都处理每个问题的详细信息,或者创建一个将原因作为属性的错误类。
让我举一个处理这两种错误的例子:
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) 中的回调。