许多 javascript 库和框架接受在某些操作完成后调用的函数。例如:
chrome.storage.local.get( 'foo', function() { console.log( "foo" ); } );
但我刚刚意识到一些 API,包括上面提到的谷歌本地存储 api 捕获并抑制被调用函数中的所有异常。例如,如果我修改上面的代码以产生错误(ReferenceError
我想在控制台中看到):
chrome.storage.local.get( 'foo', function() { a.b(); } );
由于 api 通过捕获和忽略所有错误来抑制它,因此不会引发错误。在这种情况下如何调试我的代码?是否有任何方法可以恢复错误,或者所有这些 api 都不能用于复杂的代码,我需要console.log
手动调试以找出失败的原因?
更新 1
简单地将我自己的 try-catch 添加到所有回调中会增加不受欢迎的代码的复杂性。此外,简单console.log
比异常更糟糕,因为异常被开发工具捕获,显示为红色,附加堆栈跟踪等。当然所有这些都可以模拟,console.log
但这会增加更多复杂性。
更新 2
似乎 js 代码忽略错误是一种普遍的做法,所以我被迫通过添加下划线插件并使用它来封装每个回调来实现丑陋的解决方案:
function _safeblock( block )
{
console.assert( block );
return function() {
try {
block.apply( this, arguments );
}
catch( e ) {
console.log( e.message, e.stack );
}
};
}
function _safecall( block )
{
console.assert( block );
_safeblock( block )();
}
_.mixin({
safeblock: _safeblock,
safecall: _safecall,
});