11

好的。我可能在这里分裂头发,但我的代码不一致,我想这样做。但在我这样做之前,我想确保我走的是正确的道路。实际上这并不重要,但这一直困扰着我一段时间,所以我想我会问我的同龄人......

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

显然,无论哪种方式,代码都能正常运行,但我开始困扰我有时提到“错误”,有时提到“异常”。就像我说的那样,也许我正在分裂头发,但哪个是正确的术语?“异常”还是“错误”?

4

6 回答 6

11

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

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

于 2010-04-06T18:35:40.133 回答
4

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

});
于 2010-04-06T18:39:20.663 回答
1

主要免责声明:我不认为有一个“正确”的答案。这里表达的观点是主观的和个人的。更重要的是,我将要支持的想法只有在你打算用不同的、咳咳、错误的方式做不同的事情时才有用……因为你可能会根据 Daniel Earwicker 的信息性回答使用系统。考虑到这一点:

我认为“例外是例外”。ERROR 不太出人意料。

免责声明:以下伪代码不好;它只是作为我能想到的最小案例来说明我的观点。

注意:在这个思想实验中,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 的请求是不合理的......而且我知道我应该为您完成它。由于我的代码级别比你低,我真的应该知道发生了什么……但我不知道……而且由于你理解这种特殊情况的机会比我少,我想你可能会最好停止你正在做的事情,让这条信息一直到顶部......我的意思是,这里发生了一些严重的可疑事件。

所以我想我的总结是这样的:如果错误发生在高阶代码中(你传递了错误的数据)抛出一个错误。如果错误发生在低阶代码中(您依赖的函数以您不理解且无法计划的方式失败)抛出异常......并且如果错误发生在您当前正在编写的函数中...... . 好吧,呃,如果你知道它然后修复它!

最后,更直接地回答最初的问题:在处理错误和异常方面,我的建议是:优雅地处理所有错误(可选地记录它们)......但确实要小心处理异常;仅当您确定自己知道它是什么以及为什么会发生时,才尝试从异常中恢复,否则让它冒泡(如果必须重新抛出它)。

于 2013-07-03T16:31:52.920 回答
1

异常是您可能期望的,例如在尝试打开文件时可能会遇到“未找到文件异常”。另一方面,错误是您可能看不到的东西,例如堆栈溢出或内存不足。

异常是不产生逻辑结果的函数的替代逻辑方法。例外还可以更好地解释为什么会以这种方式存在。同样,对于文件打开,文件句柄是一个逻辑结果,如果文件不存在(一个可能的例外)或者它是文件夹而不是文件(另一个可能的例外)。

于 2010-04-06T18:31:48.930 回答
1

在 JavaScript 中,它被称为错误捕获。所以我建议你使用错误而不是异常。使用“e”将选项留在中间。就像 Mozilla 的例子一样。 Mozilla 核心 JavaScript 1.5 参考

于 2010-04-06T18:32:56.357 回答
0

你在 Catch 块中得到的是一个异常,所以我将它命名为异常......

如果这是一个错误 - 我可以在我的代码中处理它并且我通常不希望在 Catch 块中看到它

HTH。

于 2010-04-06T18:28:59.890 回答