您在问题中提到尝试的try
-catch
模式是正确的方式 - 您想要 try
-catch
块,而不是静默通过模块错误的方式(通常总是非常小心地处理全局异常并继续,这样就存在您只会发现的数据损坏错误6 个月后)。
你真正的问题是这样的:
...实际上,这些函数通常会添加几个其他事件处理程序,而这些事件处理程序又需要 try/catch。我最终得到了非常重复的代码,里面塞满了 try/catch 块。
解决方法是Promise
. 这是一种新结构,在大多数浏览器中都是原生的,但在慢速浏览器(嗯,IE)中很容易填充,它为您提供了一种管理事件回调和事件异常的标准方法。
使用 aPromise
您的代码承诺总是做某事:解决/成功或拒绝/失败。
function moduleA() {
return new Promise(function (resolve, reject)
{
try{
var result = window.thisDoesntExist();
resolve(resolve); // Success!
}
catch(err){
reject(err); // Fail!
}
});
}
这更好,因为您可以将 promise 链化,而不是在每个回调中嵌套try
块catch
:
moduleA().
then(moduleB).
then(moduleC).
catch(errorHandler); // Catch any error from A, B, or C
您还可以处理错误并继续:
moduleA().
catch(continuableErrorHandler). // Catch any error from A
then(moduleB).
then(moduleC).
catch(errorHandler); // Catch any error from B or C
您仍然需要在回调中使用大量try
-catch
块,但是任何被包装在 a 中的东西都Promise
可以以相同的模块化方式处理。
JS 中的下一个是async
and await
,但您现在可以将它们与转译器一起使用。这些使用承诺使代码更易于阅读,最重要的是(对您而言)在顶部有一个单一的try
-用于从整个链中收集异常。catch
Promise
这个答案已经太长了,但我已经在博客上更详细地介绍了。
TL;DR:如果您的问题是“非常重复的 [事件回调] 代码中塞满了 try/catch 块”,请尝试Promise
改用。