请看下面的粗略代码:
function Manager()
{
try
{
A();
}
catch(e)
{
//......Never caught...
}
}
function AjaxCallback()
{
try
{
B();
}
catch(e)
{
throw e;
}
}
function B()
{
throw {//something here}
}
当我从B罚款中抛出时,我能够在回调函数中捕获异常。但是,当我在回调中重新抛出相同的错误时,它从未在管理器中被捕获。为什么?无论回调什么时候都可以执行,它的连锁似乎仍然要求错误应该回升并被经理抓住,尽管如上所述,这不会发生。任何人都可以向我解释为什么会这样,也许如何解决这个问题?
答案 0 :(得分:2)
回调被调用异步。调用回调时,“无人回家”会侦听异常。浏览器调用回调以响应HTTP请求完成的异步事件。您的try ... catch
块是一个静态构造,因此它不会在处理回调函数抛出的异常时起任何作用。 try ... catch
是同步执行的,回调函数发生时就是过去的事情。因此,你无法以这种方式捕获异常;它没有任何意义。
您可以做的是设置您的Ajax内容,以便在您决定联系服务器时,提供必要的代码来发出请求和您要运行的代码请求成功时,和请求失败时运行的代码。具体如何,取决于您正在使用的Ajax机制。
答案 1 :(得分:0)
您尚未描述A
函数的作用,但我猜它会启动一个AJAX调用 - 此调用以Manager
函数立即返回时异步运行。回调由浏览器在与Manager
函数无关的单独(全局)上下文中执行,因此您抛出的任何异常都将被删除并显示在浏览器的错误日志中。