行。我可能是鸡蛋里挑骨头在这里,但我的代码是不相符的,我想是真的。但我做之前,我要确保我会以正确的方式。在实践中,这并不重要,但是这已经困扰了我一段时间,所以我想我会问我的同龄人......

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

显然,代码正常运行两种方式,但它开始烦我,我有时把“错误”,有时到“例外”。就像我说的,也许我鸡蛋里挑骨头,但它是在正确术语? “异常” 或 “错误”?

有帮助吗?

解决方案

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

这是例外,在另一方面,是创建,并在一定条件下在代码发生抛出的对象。它可以或者可以不对应于概念上的错误。所以对我来说,适当的术语是“异常”。

其他提示

ECMAScript规范调用它们的异常。你可能想也这样做。

为了让你的日志更多的信息:

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...

});

在JavaScript的它被称为错误捕获。所以我建议你用错误的,而不是例外。 通过使用“E”留在中间的选择。喜欢在Mozilla的例子。 Mozilla的核心JavaScript 1.5参考

异常是你可以在试图打开一个文件可能会面临“未发现异常文件”预计例子。在另一方面,错误的东西,你可能看不到它的到来就像堆上流过或没有足够的内存。

的一个例外是出掉不产生一个合乎逻辑的结果的功能的替代方案合乎逻辑的方式。例外还允许发生什么事为什么存在这样一个更好的解释。对于文件的开口,又,文件句柄是一个合乎逻辑的结果,并且如果该文件是不存在的(一种可能的例外),或者它是一个文件夹不是文件(另一种可能的例外)。

主要免责声明:的,我不认为有一个“正确”的答案。这里所表达的观点是主观的,个人的。更重要的是,我要拥护的想法是唯一有用的,如果你打算做不同的事情不同,啊哈,故障等,你可能会使用系统按照丹尼尔·埃里克的信息回答。考虑到这一点:

我主张“的一个例外是例外”。的误差不意外。

声明:下面的伪代码不好;它仅用于作为最小情况下,我能想到的说明我的观点。

注:的这个思想实验,返回的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请求是不合理的......我知道我应该履行它。因为我比你是较低级代码,我真的应该知道发生了什么事情......但我不......因为你比我的理解这个特殊的情况已经少的机会,我想你大概会充其量只是停止你正在做什么,让这个消息一路去顶......我的意思是,有一些的认真的猫腻就在这里。

所以,我想,我的总结是这样的:如果错误在高阶码事(你被传递坏数据)抛出一个错误。如果错误在低阶代码发生抛出一个异常(你依赖的方式,你不理解和不能计划失败的函数)...如果错误的功能发生了,你正在写..好了,废话,如果你意识到这一点,然后解决它!

最后,要回答原来的问题更直接:在处理错误和例外条款,我的建议是:处理所有的错误优雅(可选记录他们)...但处理异常谨慎再谨慎;只是尝试,如果你真的相信你知道它是什么和为什么它发生了,否则让它泡了(重新抛出它,如果你要)从异常恢复。

什么你在catch块得到却是个例外,所以我将其命名为例外...

如果这是一个错误 - 我可以在我的代码处理它与我平时不希望看到它在catch块

HTH。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top