未处理的 JavaScript 异常终止 MSAppHost/WWAHost.exe

Unhandled JavaScript exception terminates MSAppHost/WWAHost.exe

本文关键字:WWAHost exe MSAppHost 异常终止 JavaScript 未处理      更新时间:2023-09-26
<!DOCTYPE html>
<html>
  <head>
    <title>Throw test</title>
  </head>
  <body>
    <button onclick="throw 'does this abort the app'">CRASH</button>
  </body>
</html>

此代码作为通用 Windows 应用 (MSAppHost/3.0( (WWAHost.exe( 运行时,将终止应用(退出代码 0x3(。 有没有办法防止这种行为?

我尝试添加窗口错误处理程序,但它不会阻止应用程序终止。

window.onerror = function(e) { return false; }

编辑 这是一个基于 Cordova 的 Windows 10 移动项目,运行现有的 html5 应用程序。必须在每个事件处理程序周围添加 try catch 将是一项令人难以置信的工作量。

编辑 在 JavaScript 中,异常应仅中止事件的执行上下文,而不是整个应用的执行上下文。

有没有办法防止这种行为?

防止此行为的最佳方法是处理异常。 全局异常处理程序通常不受欢迎,除了可能记录错误之外,因为它们不可能处理所有可能的异常,并且只会导致应用程序最终处于未知状态。

如果您无法在相关的地方以可靠的方式处理异常,则意味着您不知道问题是什么,并且由于未知状态,您的应用程序可能会以其他方式开始失败 - 此时它也可能完全停止运行。


综上所述,在 HTML 中,您可以从 onerror 处理程序return true,而不是false以防止异常进一步冒泡。 例如,这将在控制台中记录错误,但不显示未捕获的错误:

$('button').click(function() {
    console.log('a');
    throw "oops";
    console.log('b');
});
window.onerror = function(e) {
    console.log('error', e);
    return true;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>
test
</button>

但这都会记录错误,然后显示未捕获的错误:

$('button').click(function() {
    console.log('a');
    throw "oops";
    console.log('b');
});
window.onerror = function(e) {
    console.log('error', e);
    //don't return true
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>
test
</button>

您是否尝试过添加 catch 子句?这使您可以捕获错误而不会使应用程序崩溃。这将正确处理异常