2012-06-22 34 views
1

有誰能告訴我如何處理WinJS代碼中未處理的異常。是否有更好的方式來處理它們而不是使用try/catch塊。我已經在我的代碼的某些部分中使用了try/catch塊。WinJS中未處理的異常

回答

3

try/catch是處理異常的語言機制。

您是否正在處理常規異常,或者您在異步代碼(承諾內)中是否有未處理的異常?如果是後者,則try/catch將不起作用,因爲設置try/catch的堆棧幀在異步操作完成時消失。

在這種情況下,你需要一個錯誤處理程序添加到您的承諾:

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結束了,所以你可以捕捉到他們那裏。我現在只做日誌記錄;試圖恢復你的應用程序,並繼續從頂級錯誤處理程序運行通常是一個壞主意。

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 


    }; 

這將讓您拍攝擺好出現在應用程序的所有未處理的異常。

+0

你不能從錯誤處理程序雖然 –

+0

@TomMcKearney你是正確顯示UI。你必須記錄錯誤,然後讓另一個進程顯示錯誤信息。 – techsaint

0

鏈接: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,但可以寫入磁盤。

1

下面是我不得不親自發現的所有這些解決方案的替代方案。無論何時使用promise對象,都要確保done()調用同時處理成功和錯誤情況。如果你不處理失敗,那麼系統最終會拋出一個不會被try/catch塊或通過通常的WinJS.Application.onerror方法捕獲的異常。

這個問題之前,我發現它在我自己花了我2個Windows應用商店的拒絕已經... :(