8

このコードは、WP8 アプリで正常に動作します。

void App_UnhandledException(object sender, UnhandledExceptionEventArgs args)
{
    string appName;
    string appVersion;
    var xmlReaderSettings = new XmlReaderSettings
    {
        XmlResolver = new XmlXapResolver()
    };

    using (var xmlReader = XmlReader.Create("WMAppManifest.xml", xmlReaderSettings))
    {
        xmlReader.ReadToDescendant("App");

        appName = xmlReader.GetAttribute("Title");
        appVersion = xmlReader.GetAttribute("Version");
    }

    WAMS_EXCEPTIONLOG wamsel = new WAMS_EXCEPTIONLOG
    {
        appNameAndVersion =
            string.Format("{0} {1}", appName,
                          appVersion),
        ExceptionMsg =
            args.ExceptionObject.Message,
        InnerException =
            args.ExceptionObject
                .InnerException.ToString(),
        ExceptionToStr =
            args.ExceptionObject.ToString(),
        dateTimeOffsetStamp =
            DateTimeOffset.UtcNow
    };
    await MobileService.GetTable<TASLS_WAMS_EXCEPTIONLOG>().InsertAsync(wamsel);
}

...しかし、補足的な Windows ストア アプリでは、いくつかのクラスとクラス メンバーが認識されません。

XmlResolver
XmlXapResolver
args.ExceptionObject

(言うまでもなく、await は許可されておらず、イベント ハンドラーに "async" を追加すると、イベント ハンドラーの割り当てが "赤くなる" ようになります)...

要点に戻ると、WP8 アプリと同じ機能を Windows ストア アプリで実現するにはどうすればよいでしょうか?

4

1 に答える 1

17

最初にあなたの問題に対処させてください:

  • パッケージ情報を XML から直接読み取る必要はありません。代わりにPackageId クラスを使用できます。
  • 例外情報は に保存されargs.Exceptionます。
  • メソッド シグネチャを入力することにより、イベント ハンドラーから非同期メソッドを呼び出すことができますがasync void、メソッドは「起動して忘れる」モードで呼び出されることに注意する必要があります。つまり、アプリは非同期メソッドが完了するまで待機しません。設定args.Handled = trueしてアプリが閉じないようにしても問題ありません。

固定イベント ハンドラーは次のようになります。

private async void App_UnhandledException(object sender, UnhandledExceptionEventArgs args)
{
    string appName = Package.Current.Id.Name;
    var version = Package.Current.Id.Version;
    string appVersion = String.Format("{0}.{1}.{2}.{3}", 
        version.Major, version.Minor, version.Build, version.Revision);

    WAMS_EXCEPTIONLOG wamsel = new WAMS_EXCEPTIONLOG
    {
        appNameAndVersion = string.Format("{0} {1}", appName, appVersion),
        ExceptionMsg = args.Exception.Message,
        InnerException = args.Exception.InnerException.ToString(),
        ExceptionToStr = args.Exception.ToString(),
        dateTimeOffsetStamp = DateTimeOffset.UtcNow
    };
    args.Handled = true;
    await MobileService.GetTable<TASLS_WAMS_EXCEPTIONLOG>().InsertAsync(wamsel);
}

args.Exception.InnerExceptionまた、呼び出す前に nullかどうかを確認する必要がありますToString()

于 2013-01-17T05:55:34.743 に答える