谁能告诉我如何处理 WinJS 代码中未处理的异常。有没有更好的方法来处理它们而不是使用 try/catch 块。我已经在我的代码的某些部分使用了 try/catch 块。
4 回答
try/catch 是处理异常的语言机制。
您是在处理常规异常,还是在异步代码中(在 Promise 中)有未处理的异常?如果是后者,try/catch 将不起作用,因为设置 try/catch 的堆栈帧在异步操作完成时已经消失。
在这种情况下,你需要在你的 Promise 中添加一个错误处理程序:
doSomethingAsync().then(
function (result) { /* successful completion code here */ },
function (err) { /* exception handler here */ });
异常沿着承诺链传播,因此您可以在最后放置一个处理程序,它将处理该承诺链中的任何异常。您还可以将错误处理程序传递给 done() 方法。结果可能如下所示:
doSomethingAsync()
.then(function (result) { return somethingElseAsync(); })
.then(function (result) { return aThirdAsyncThing(); })
.done(
function (result) { doThisWhenAllDone(); },
function (err) { ohNoSomethingWentWrong(err); }
);
最后,未处理的异常最终会出现在 window.onerror 中,因此您可以在那里捕获它们。我现在只会做日志记录;尝试恢复您的应用程序并继续从顶级错误处理程序运行通常是一个坏主意。
我认为您要求的等效于 ASP.NET Webforms Application_Error 包罗万象。WinJS 等效于 ASP.NET 的 Application_Error 方法是WinJS.Application.onerror。
使用它的最佳方法是在您的 default.js 文件(或类似文件)中并添加一个侦听器,例如:
WinJS.Application.onerror = function(eventInfo){
var error = eventInfo.detail.error;
//Log error somewhere using error.message and error.description..
// Maybe even display a Windows.UI.Popups.MessageDialog or Flyout or for all unhandled exceptions
};
这将允许您优雅地捕获应用程序中出现的所有未处理的异常。
这是我必须自己发现的所有这些解决方案的替代方案。每当您使用 promise 对象时,请确保您的 done() 调用同时处理成功和错误情况。如果您不处理故障,系统最终将抛出一个异常,该异常不会被 try/catch 块或通常的 WinJS.Application.onerror 方法捕获。
在我自己发现它之前,这个问题已经让我损失了 2 次 Windows Store 拒绝... :(
要处理未处理的异常,您真正需要做的就是挂钩WinJS Application.onerror事件,就像这样(来自 default.js 文件:)
(function () {
"use strict";
var app = WinJS.Application;
var activation = Windows.ApplicationModel.Activation;
var nav = WinJS.Navigation;
WinJS.strictProcessing();
app.onerror = function (error) {
//Log the last-chance exception (as a crash)
MK.logLastChanceException(error);
};
/* rest of the WinJS app event handlers and methods */
app.start();})();
请记住,当 WinRT 崩溃时,您无法访问网络 IO,但您可以写入磁盘。