代码之家  ›  专栏  ›  技术社区  ›  Josh Andreas Rehm

JavaScript try/catch:错误还是异常?

  •  11
  • Josh Andreas Rehm  · 技术社区  · 16 年前

    好的我在这里可能有分歧,但我的代码不一致,我想这样做。但在我这么做之前,我想确定我走的是正确的路。实际上这并不重要,但这已经困扰了我一段时间,所以我想我应该问问我的同龄人。。。

    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 回复  |  直到 16 年前
        1
  •  11
  •   tloflin    16 年前

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

        2
  •  4
  •   Daniel Earwicker    16 年前

    这个 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...
    
    });
    
        3
  •  1
  •   ReinierDG    16 年前

    在JavaScript中,它被称为错误捕获。所以我建议你用error代替exception。 中间选择“E”。就像Mozilla的例子。 Mozilla Core JavaScript 1.5 Reference

        4
  •  1
  •   NawaMan    16 年前

    异常是您可能预期的情况,例如,试图打开文件时可能会遇到“找不到文件异常”。另一方面,错误是您可能看不到的,比如堆栈溢出或内存不足。

        5
  •  1
  •   AndyH    13 年前

    主要免责声明:

    我主张“例外就是例外”。一个错误不那么意外。

    免责声明: 下面的伪代码不好;这只是我能想到的最起码的例子来说明我的观点。

    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的请求是不合理的。。。我知道我应该为你实现它。既然我的代码比你低,我真的应该知道发生了什么。。。但我不。。。既然你理解这种特殊情况的机会比我少,我想你最好停止你的行为,让这条信息一直传到最高层。。。我是说,有些东西 这里的情况很可疑。

    所以我想我的总结是这样的:如果错误发生在高阶代码中(你被传递了坏数据),抛出一个错误。如果错误发生在低阶代码中(您所依赖的函数以您不理解且无法计划的方式失败),则抛出异常。。。如果错误发生在你正在写的函数中。。。嗯,嗯,如果你知道的话,那就把它修好!

        6
  •  0
  •   Sunny    16 年前

    如果是错误-我可以在代码中处理;我通常不希望在捕鲸区看到它

    嗯。

    推荐文章