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 */ });
例外は promise チェーンに沿って伝播するため、単一のハンドラーを最後に置くことができ、その promise チェーン内のすべての例外を処理します。エラー ハンドラを 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 キャッチオールに相当するものを求めていると思います。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
};
これにより、アプリケーションに表示されるすべての未処理の例外を正常にキャプチャできます。
これは、私が自分で発見しなければならなかったこれらすべてのソリューションに代わるものです。promise オブジェクトを使用するときはいつでも、done() 呼び出しが成功とエラーの両方の状況を処理することを確認してください。エラーを処理しないと、システムは、try/catch ブロックでも通常の WinJS.Application.onerror メソッドでもキャッチされない例外をスローすることになります。
この問題は、私が自分で発見する前に、すでに 2 つの Windows ストアで拒否されていました... :(
リンク:ハウツー: WinJS アプリケーションでのラスト チャンス例外処理
未処理の例外を処理するために本当に必要なことは、次のように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 にアクセスできませんが、ディスクに書き込むことはできることに注意してください。