行。我可能在这里分裂头发,但我的代码不一致,我想这样做。但在此之前,我想确保我走的是正确的方式。在实践中这没关系,但这一直困扰我一段时间,所以我想我会问我的同龄人......
每次我使用try... catch
语句时,在catch块中我总是将消息记录到我的内部控制台。但是我的日志消息不一致。他们看起来像:
catch(err) {
DFTools.console.log("someMethod caught an error: ",err.message);
...
或:
catch(ex) {
DFTools.console.log("someMethod caught an exception: ",ex.message);
...
显然,代码在任何一种方式下都能正常运行,但是我开始困扰我,我有时会提到“错误”,有时会提到“异常”。就像我说的那样,也许我正在分裂头发,但这是正确的术语? “例外”或“错误”?
答案 0 :(得分:11)
这有点主观,但对我来说,错误是当某人或某事做错事,不当或无效时。它可能是语法错误,逻辑错误,读取错误,用户错误,甚至是社交错误。这是一个抽象的概念。
另一方面,异常是在代码中出现特定条件时创建和抛出的对象。它可能或可能不对应于概念错误。所以对我来说,正确的命名法是“例外”。
答案 1 :(得分:4)
ECMAScript specification称他们为例外。您可能也想这样做。
使您的日志记录更具信息性:
catch(ex) {
DFTools.console.log("someMethod caught an exception of type "
+ ex.name + ": ", ex.message);
您可能还需要记住,异常(不幸的是)可以是任何类型,因此不一定具有name
和message
属性:
catch(ex) {
if (ex.message && ex.name) {
DFTools.console.log("someMethod caught an exception of type "
+ ex.name + ": ", ex.message);
} else /* deal with it somehow */
由于在任何地方重复开始看起来很麻烦,你可能想要在函数中捕获它:
function logExceptions(methodName, action) {
try {
action();
} catch (ex) {
if (ex.message && ex.name) {
DFTools.console.log("someMethod caught an exception of type "
+ ex.name + ": ", ex.message);
} else {
DFTools.console.log("someMethod caught a poorly-typed exception: " + ex);
}
}
}
现在你可以说:
logExceptions(function() {
// do some risky stuff...
});
答案 2 :(得分:1)
异常是您可能期望的,例如在尝试打开文件时可能会遇到“文件未找到异常”。另一方面,错误是你可能看不到它像堆栈溢出或内存不足。
异常是一种不产生逻辑结果的函数的替代逻辑方法。一个例外也可以更好地解释为什么它以这种方式存在的原因。对于文件打开,同样,文件句柄是逻辑结果,如果文件不存在(一个可能的例外),或者文件夹不是文件(另一个可能的例外)。
答案 3 :(得分:1)
在JavaScript中,它被称为错误捕获。所以我建议你使用错误而不是异常。 使用“e”将选项留在中间。就像在Mozilla的例子中一样。 Mozilla Core JavaScript 1.5 Reference
答案 4 :(得分:1)
主要免责声明:我不认为对此有“正确”的答案。这里表达的观点是主观的和个人的。更重要的是,我即将支持的想法只有在你要用不同的,讽刺的,错误的方式做不同的事情时才有用......因为你可能会根据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,则会发生ERROR。在我看来,区别在于更高级别的代码(或用户输入)做错了...这个函数必须将ERROR向上传递给更高级别的代码,该代码可以决定如何处理这个结果。像这样考虑......这个函数会对任何消费函数说:
看,我的朋友,我知道这里发生了什么:请求BobAccounts.xml是一个错误,所以不要再这样做了!哦,如果你认为你现在知道可能出了什么问题(滥用了我),那就继续尝试从中恢复过来!
现在考虑这个函数采用名称,检查文件是否存在然后由于某种原因无法检索它的情况。这是一种不同的情况。出乎意料的事情发生了。更重要的是,消费代码不应该归咎于。现在我们真的希望这个函数对任何消费函数说:
哦,小提琴!对此抱歉,我谦卑地请求你的原谅,但我不太理解的一些例外是错误的。我不认为您对BobAccounts.xml的请求是不合理的......我知道我应该为您实现它。因为我的代码比你低,所以我真的应该知道发生了什么......但是我不知道......因为你理解这种特殊情况的机会比我少,我认为你可能最好只是停止你正在做的事情,让这条消息一路走到顶端...我的意思是,这里有一些严重可疑的东西。
所以我想我的总结是这样的:如果错误发生在高阶代码中(你传递了错误的数据)会抛出一个错误。如果错误发生在低阶代码中(你依赖的函数以你不理解和无法计划的方式失败)抛出一个EXCEPTION ......如果你正在编写的函数中发生了错误...嗯,呃,如果你知道它然后解决它!
最后,更直接地回答原始问题:在处理ERRORS和EXCEPTIONS方面,我的建议是:优雅地处理所有错误(可选地记录它们)......但是要小心处理EXCEPTIONS;如果你确定你知道它是什么以及为什么会发生这种情况,那么只能尝试从EXCEPTION中恢复,否则就让它冒泡(如果你不得不重新抛出它)。
答案 5 :(得分:0)
您在Catch块中获得的是异常,因此我将其命名为异常......
如果是错误 - 我可以在我的代码中处理它我通常不希望在Catch块中看到它
HTH。