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

(更不用说不允许等待的事实,并且将“异步”添加到事件处理程序会导致事件处理程序的分配“变红”)......

那么,回到重点:如何通过 Windows Store 应用程序实现与 WP8 应用程序相同的功能?

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为空ToString()

于 2013-01-17T05:55:34.743 回答