JavaScript中错误捕获的正确粒度是什么?

Ema*_*nde 6 javascript error-handling try-catch

我曾经把try...catch我的JS类的任何方法放在里面:

var MyConstructor = function() {
    this.init = function() {
        try {
            // the method code...
        } catch(error) {
            // the error manager log actions
        }
    };
    // other methods, with the same try/catch usage
};
Run Code Online (Sandbox Code Playgroud)

这样,保持代码接口相对简单,我认为我的代码中的任何错误都会被捕获并记录/管理.

var myInstance = new MyConstructor();
Run Code Online (Sandbox Code Playgroud)

相反,每个脚本是否足够一个全局捕获块?关心每个可能(或值得注意的)错误,在我看来应该知道应用程序中发生的每个错误:

// no try...catch inside the classes, but only a global try...catch per script:
try {
    var myInstance = new MyConstructor();
} catch(error) {
    /*
        log in the needed environment
        (e.g. client-side, via console, or to the server...)
    */
}
Run Code Online (Sandbox Code Playgroud)

我搜索并阅读Stackoverflow上的线程以及有关JavaScript错误管理的非凡资源.
在这个阶段,我感兴趣的是找到找到所有错误的最佳方法,而不是管理它们以获得用户界面的优雅行为.
这不是正确的方法吗?我对任何建议持开放态度.

Ben*_*aum 2

经验法则是你应该问自己“谁应该逻辑地处理问题?” 并坚持下去。

重要的是要记住,当您编写一段代码时,您实际上编写了一个描述代码片段如何交互的契约。例如,在您创建 MyConstructor 实例的情况下,为什么它会失败?当它生成时做出了什么承诺?最重要的是,谁应该来处理失败的问题?

一些例子

假设我们有一个类Car,并且它的实例Car有一个方法drive(x)

当您调用drive(x)移动位置时Carx向右移动。

该操作drive(x)可能会失败,例如,如果Car已经位于屏幕边缘,或者Car没有燃料。

我们刚刚定义drive为“汽车向右移动了 x 个位置”,这意味着汽车期望能够完成驾驶动作,而无法完成在逻辑上是一个例外。在这种情况下,很明显,处理异常的是drive的调用者,而不是汽车本身,因为它不需要知道它正在什么环境下行驶。更好的是,打电话的人不应该尝试将汽车驶离边缘或在没有燃油的情况下行驶。

在另一种情况下

假设在同一个示例中Environment是一个包含汽车的类,并且它有一个moveCars()方法可以根据某些内部包含的逻辑移动环境中的所有汽车。Environment由期望它包含所有运动逻辑的程序使用。我们使用某种算法来moveCars()确保汽车不会相撞。

我们可能会遇到一些我们在方法中没有想到的边缘情况moveCars(),或者由于某些假设而不应发生的情况,但是环境的用户期望它包含所有移动逻辑,这意味着当发生异常时它应该处理与它本身。

那么,总体策略是什么?

您应该根据运行代码的组件的职责来处理异常。