3

考虑以下代码:

using (IRandomAccessStream stream = await storageFile.OpenReadAsync())
{
    using (DataReader dataReader = new DataReader(stream))
    {
        uint length = (uint)stream.Size;
        await dataReader.LoadAsync(length);
        txtbox.Text = dataReader.ReadString(length);
    }
}

storageFile.OpenReadAsync可能抛出异常,System.IO.FileNotFoundException是一种可能的异常类型。MSDN 主题StorageFile.OpenReadAsync http://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.storagefile.openreadasync不包含此方法引发的异常类型列表。如何从文档中找到这些信息?我可以捕捉到一种Exception类型,但这是一种糟糕的编程习惯。

4

1 回答 1

1

在无法找到所有异常列表的情况下,我通常使用 VS SDK ErrorHandler.IsCriticalException的方法:

try
{
    // ...
}
catch(Exception e)
{
    if (ErrorHandler.IsCriticalException(e))
    {
        throw;
    }

    // log it or show something to user
}

您可以反编译Microsoft.VisualStudio.Shell.11.0.dll找到异常列表,ErrorHandler 将其定义为关键:

  • 堆栈溢出异常
  • AccessViolationException
  • AppDomainUnloadedException
  • 坏图像格式异常
  • 除零异常

在 Windows 运行时的情况下,我认为验证 Exception 中的一些HResult值也会很好,比如 E_OUTOFMEMORY、E_ABORT、E_FAIL,也许还有其他东西。

我还发现BugSense对记录异常非常有帮助。我不仅将它用于未处理的异常,还用于像这样的情况,我不知道这个方法会抛出什么。它允许使用 发送自定义日志记录(包括异常)BugSenseHandler.Instance.LogException,因此我只收集有关不同类型异常的信息(包括具有一些意外 HResult 的异常),并在每个版本中对我的应用程序进行一些改进。

于 2013-04-30T18:00:19.263 回答