【发布时间】:2013-06-11 16:57:14
【问题描述】:
我正在开发一个包含解析器的小型 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') {
...
}
}
...
}
哪种方法更好?两者都可以,但我不喜欢第一个。在我看来,许多课程都是巨大的开销。
编辑:
我同意使用回调(也回答了here):
// 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) 中的回调。
【问题讨论】:
-
+1 用于
===。我更喜欢第一个版本,尽管我从不在 Javascript 中使用try-catches。 -
+1 为案例。我也想知道 js 中最好的方法是什么。
-
我很惊讶,来自 Java 的你不愿意使用很多类 :) 但真的那么长吗:
var ExceptionTypeA = function(){};? -
@YaK 我想遵循 this 错误类的约定。在 Java 中,我有点沉迷于类,而在 JS 中,我更喜欢对象属性而不是带有构造函数、getter 和 setter 的类:)
标签: javascript node.js exception exception-handling try-catch