2013-04-30 59 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 2013-04-30 14:52:09

+0

StorageFile是Windows運行時的一部分。不要以爲能夠反彙編Windows運行時來查找異常。 – outcoldman 2013-04-30 17:40:36

回答

1

在是不可能找到例外的所有列表我通常使用的方法從VS SDKErrorHandler.IsCriticalException案件:

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

    // log it or show something to user 
} 

你可以反編譯Microsoft.VisualStudio.Shell.11.0.dll發現異常,其中的ErrorHandler定義爲關鍵的名單:

  • StackOverflowException
  • AccessViolationException
  • AppDomai nUnloadedException
  • BadImageFormatException
  • DivideByZeroException

在Windows運行時的我認爲這將是很好也驗證一些異常的HResult值,比如E_OUTOFMEMORY,E_ABORT,E_FAIL,也許別的東西的情況下, 。

此外,我發現BugSense是記錄異常的絕佳幫助。我不僅將它用於未處理的異常,而且還用於這種情況,我不知道這種方法可能拋出什麼。它允許發送自定義日誌記錄(包括例外)與BugSenseHandler.Instance.LogException,所以我只收集有關不同類型的異常(包括一些意外的HResult異常)的信息,並在每個版本中對我的應用程序進行一些改進。

+0

使用'ErrorHandler.IsCriticalException'是個好主意。這減少了使用'catch(Exception)'的恥辱。我希望微軟將改進他們的Windows應用商店的文檔。謝謝。 – 2013-05-01 05:17:04