主要声明:我认为没有“正确”的答案。这里所表达的观点是主观和个人的。更重要的是,我即将阐述的想法只有在您使用不同的系统和错误时才有用,例如按照Daniel Earwicker信息性答案的方式。考虑到这一点:
我认为“异常是例外”。错误比较不出乎意料。
免责声明:以下伪代码并不好,它仅仅作为我能想到的最小案例来说明我的观点。
注意:在这个思想实验中,如果无法找到指定的文件,则GetFile返回UNDEFINED。
function AlwaysGetFile(name){
var file = null;
if(FileExists(name)){
file = GetFile(name);
if(typeof file === "undefined"){
throw new "couldn't retrieve file" EXCEPTION
}
}
else{
throw new "file does not exist" ERROR
}
return file;
}
如果消费者使用不存在的文件名调用GetFileOrThrow,则会出现错误。在我看来,区别实际上是更高级别的代码(或用户输入)在做错事情...这个函数必须将错误传递给那个高级别的代码,该代码可以决定如何处理此结果。想象一下...这个函数会对任何消费函数说:
“听着,朋友,我知道这里发生了什么:请求BobAccounts.xml是一个错误,所以不要再试了!哦,如果你认为你现在知道可能出了什么问题(因为滥用了我),那就试着从中恢复吧!”
现在考虑这个函数接受名称、检查文件是否存在,然后由于某种原因无法检索它的情况。这是一种不同的情况。真正意外的事情发生了。更重要的是,消费代码
没有责任。现在我们真的希望这个函数对任何消费函数说:
抱歉,出了点问题,我不明白发生了什么异常情况。我认为您请求BobAccounts.xml并不过分,我应该满足您的需求。由于我的级别比您低,所以我真的应该知道发生了什么事情,但我不知道。既然您比我更难理解这个异常情况,最好停止您正在做的事情,并让这个消息传到最高层……我的意思是,这里有一些非常可疑的事情发生了。
因此,我的结论是:如果错误发生在高级代码中(您收到了错误数据),则抛出错误。如果错误发生在低级代码中(您依赖的函数以您无法理解和计划的方式失败),则抛出异常......如果错误发生在您当前编写的函数中......那么,嗯,如果您意识到了它,请修复它!
最后,为了更直接地回答原问题:在处理错误和异常方面,我的建议是:优雅地处理所有错误(可选择记录它们)...但确实要小心处理异常;只有在确信知道发生了什么以及为什么发生时,才尝试从异常中恢复,否则让其冒泡(必要时重新抛出异常)。
throw new Error("...")
。 - Joshthrow "Hi Mom!";
是完全有效的。 - Pointy