gpt4 book ai didi

javascript:如何使用抑制回调异常的库?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:35:30 26 4
gpt4 key购买 nike

许多 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,
});

最佳答案

您可以尝试自己捕获它们。

chrome.storage.local.get( 'foo', function() {
try{
a.b();
}catch(e){
console.log(e);
//do whatever
}
});

您可以通过覆盖 storage.local.get 或创建通用函数包装器来自动执行此操作。

您还可以使用 setTimeout 手动延迟函数,这将使库无法(在浏览器中)抑制您的错误

chrome.storage.local.get( 'foo', function() {
setTimeout(function(){
a.b();
});
});

虽然这不会为您提供非常有意义的堆栈跟踪(函数之外的任何内容都不会显示),这会降低它的用处。如果您在性能敏感的情况下使用它,也可能会产生性能开销(并且在浏览器中 setTimeout 至少需要几毫秒,尽管它周围有一个 postMessage hack)。

关于javascript:如何使用抑制回调异常的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19426400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com