WinJS中未处理的异常

时间:2012-06-22 17:43:38

标签: javascript windows-8 winjs

有人能告诉我如何处理WinJS代码中未处理的异常。是否有更好的方法来处理它们而不是使用try / catch块。我已经在代码的某些部分使用了try / catch块。

4 个答案:

答案 0 :(得分:3)

try / catch是处理异常的语言机制。

您是在处理常规异常,还是异步代码中有未处理的异常(在promise中)?如果是后者,try / catch将不起作用,因为设置try / catch的堆栈帧在异步操作完成时消失了。

在这种情况下,您需要为您的承诺添加错误处理程序:

doSomethingAsync().then(
    function (result) { /* successful completion code here */ },
    function (err) { /* exception handler here */ });

异常沿着promise链传播,因此您可以在最后放置一个处理程序,它将处理该promise链中的任何异常。您还可以将错误处理程序传递给done()方法。结果可能如下所示:

doSomethingAsync()
    .then(function (result) { return somethingElseAsync(); })
    .then(function (result) { return aThirdAsyncThing(); })
    .done(
        function (result) { doThisWhenAllDone(); },
        function (err) { ohNoSomethingWentWrong(err); }
    );

最后,未处理的异常最终会以window.onerror结束,因此您可以在那里捕获它们。我此时只会记录日志;试图恢复你的应用程序并继续从顶级错误处理程序运行通常是一个坏主意。

答案 1 :(得分:2)

我认为你要求的等同于ASP.NET Webforms Application_Error catchall。与ASP.NET的Application_Error方法等效的WinJS是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


    };

这将允许您正常捕获应用程序中出现的所有未处理的异常。

答案 2 :(得分:1)

这是我必须自己发现的所有这些解决方案的替代方案。每当使用promise对象时,请确保done()调用处理成功和错误情况。如果你不处理失败,系统将最终抛出一个异常,它不会被try / catch块或通常的WinJS.Application.onerror方法捕获。

在我自己发现它之前,这个问题已经花了我2个Windows商店的拒绝... :(

答案 3 :(得分:0)

link:How-To: Last Chance Exception Handling in WinJS Applications

处理未处理的异常真正需要做的就是挂钩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,但您可以写入磁盘。