Javascript 在何处捕获EVAL中引发的异常

Javascript 在何处捕获EVAL中引发的异常,javascript,ajax,eval,Javascript,Ajax,Eval,下面的脚本使您能够运行一段javascript代码。try/catch块正在捕获错误 try { var result = eval(script); } catch (e) { // do something meaningful } 但是,如果变量script包含例如一个AJAX调用,并且该AJAX调用引发一个异常(例如,在success函数中),则该try/catch块将不会捕获该异常 // execute an AJAX

下面的脚本使您能够运行一段javascript代码。try/catch块正在捕获错误

    try {
        var result = eval(script);
    } catch (e) {
        // do something meaningful
    }
但是,如果变量
script
包含例如一个AJAX调用,并且该AJAX调用引发一个异常(例如,在success函数中),则该try/catch块将不会捕获该异常

    // execute an AJAX request
        var script = '$.ajax(url:"/somewhere", success: function(){throw new MyException('testexception')})';
    try {
        var result = eval(script);
    } catch (e) {
        // will not be triggered...
    }

问题:如何捕获ajax请求中抛出的异常?

我希望您意识到使用
eval
的危险,如果没有,也有很多好文章解释了为什么这不是一个好主意

也就是说,问题是在catch块之后调用success回调。您需要在成功回调中添加
try/catch
块,或者需要从更全局的角度处理错误。我能想到的一个方法就是利用这个事件。我下面有一个示例,它显示了与您的问题类似的内容,并且显示了您可以捕获
eval
中抛出的错误

(函数(){
"严格使用",;
window.addEventListener('error',e=>console.log('window.onerror:${e.message}');
let script=`setTimeout(函数(){
抛出新的错误('woops!');
}, 0);`;
评估(脚本);
脚本=`throw new Error('woops!');`;
试一试{
评估(脚本);
}捕获(e){
控制台日志(e.message);
}

})();
除了根本不使用
eval
之外,即使您没有使用它,并且在
try/catch
块中有该函数,它也不会捕获
success
函数中的异常,因为它是回调。在您退出
try/catch
之前,不会调用该代码。这不是关于在ajax请求中添加错误回调吗?@MattBurland 100%同意-但这是我的问题…@Huangism no。不这样认为。简单的回答是,您必须在回调中捕获回调中的异常