我正在开发一个包含解析器的小型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') {
...
}
...
}
}问题依然存在:我是否应该删除所有类,使用一个简单的对象,而不使用任何原型继承?我需要将有关问题的信息传递给错误处理程序(无论是catch还是回调)。
我想让这个函数保持同步,因为它很小,而且速度很快(是的,我知道回调不会产生函数异步)。AFAIK Node.js本身在同步代码(fs.readFileSync)中抛出错误,同时将错误对象传递给异步函数(fs.readFile)中的回调。
发布于 2013-06-15 04:33:29
我认为,节点的最佳方法是以回调方式重写模块。尽管您应该传递两个参数:第一个参数是error或null (如果操作成功完成),第二个参数是操作的结果(如果发生错误,则为null或未定义)。
你可以在你的回调中简单地处理它们。您可以将错误作为字符串传递,然后只传递大小写(错误)以处理不同的情况。
UPD:
对于同步方法,您可以使用抛出,但也可以只抛出字符串,然后切换它们。如果您希望将错误类型化(例如,如果方法可能抛出非常不同的错误(在Java代码中它们可能在不同的类中进行描述),则可以使用如下所示的对象:{ error:'error_name',type:'error_type‘}。
然后切换(err.type),开关(err.error)。
在Javascript中使用类并不是最好的方法,因为它只是创建带有prototype属性的对象,指向构造函数对象,并且instaceof比较这些指针。
https://stackoverflow.com/questions/17118711
复制相似问题