2013-04-30 2 views
3

Рассмотрим следующий код:Как найти исключения, брошенные методом OpenReadAsync

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.OpenReadAsynchttp://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.storagefile.openreadasync не содержит список типов исключений, создаваемых этим методом. Как я могу найти эту информацию из документации? Я могу поймать тип Exception, но это плохая практика программирования.

+0

Вы пытались разобрать DLL? – mydogisbox

+0

StorageFile является частью Windows Runtime. Не думайте, что можно будет разобрать время выполнения Windows, чтобы найти исключения. – outcoldman

ответ

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 определяет, как Critical:

  • StackOverflowException
  • AccessViolationException
  • AppDomai nUnloadedException
  • BadImageFormatException
  • DivideByZeroException

В случае среды выполнения Windows, я думаю, что это будет хорошо и проверить некоторые из HResult значений в Exception, как E_OUTOFMEMORY, E_ABORT, E_FAIL, и, возможно, что-то еще ,

Также я обнаружил, что BugSense является прекрасной помощью для регистрации исключений. Я использую его не только для необработанного исключения, но и для таких ситуаций, когда я понятия не имею, что этот метод может бросить. Он позволяет отправлять собственные журналы (включая исключения) с BugSenseHandler.Instance.LogException, поэтому я просто собираю информацию о различных исключениях (включая исключения с некоторым неожиданным HResult) и вношу некоторые улучшения для своего приложения в каждой версии.

+0

Использование 'ErrorHandler.IsCriticalException' - хорошая идея. Это уменьшает стыд использования 'catch (Exception)'. Я надеюсь, что Microsoft улучшит свою документацию для Windows Store. Благодарю. –

Смежные вопросы