JavaScript try / catch:错误或异常?

时间:2010-04-06 18:26:35

标签: javascript error-handling nomenclature

行。我可能在这里分裂头发,但我的代码不一致,我想这样做。但在此之前,我想确保我走的是正确的方式。在实践中这没关系,但这一直困扰我一段时间,所以我想我会问我的同龄人......

每次我使用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);
...

显然,代码在任何一种方式下都能正常运行,但是我开始困扰我,我有时会提到“错误”,有时会提到“异常”。就像我说的那样,也许我正在分裂头发,但这是正确的术语? “例外”或“错误”?

6 个答案:

答案 0 :(得分:11)

这有点主观,但对我来说,错误是当某人或某事做错事,不当或无效时。它可能是语法错误,逻辑错误,读取错误,用户错误,甚至是社交错误。这是一个抽象的概念。

另一方面,异常是在代码中出现特定条件时创建和抛出的对象。它可能或可能不对应于概念错误。所以对我来说,正确的命名法是“例外”。

答案 1 :(得分:4)

ECMAScript specification称他们为例外。您可能也想这样做。

使您的日志记录更具信息性:

catch(ex) {
    DFTools.console.log("someMethod caught an exception of type " 
       + ex.name + ": ", ex.message);

您可能还需要记住,异常(不幸的是)可以是任何类型,因此不一定具有namemessage属性:

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。