如果Windows運行時類型引發COM錯誤,.NET似乎經常(或總是)將此錯誤包裝爲Exception
實例。錯誤消息包括COM HRESULT錯誤代碼。例如,在AES-CBC中使用新的Cryptographic API時,錯誤的緩衝區長度會導致Exception
帶有消息「提供的用戶緩衝區對於請求的操作無效(Exception from HRESULT: 0x800706F8
)」。如何處理導致異常的WinRT異常?
那麼,我們應該如何處理這些例外?我們是否應該讀取來自異常的HRESULT
代碼,以瞭解是什麼樣的異常?在經典的.NET中,我會得到一個CryptographicException
,我可以用它來區分密碼錯誤和其他錯誤。
我不明白的另一件事是,Microsoft代碼質量規則聲明,不應該拋出異常,但總是派生類型。原因是,沒有人應該被迫抓住一般的Exception
,以獲得更多致命的例外,如OutOfMemoryException
。另一條規則是,永遠不要在圖書館抓到Exceptio
n。如果我們被迫在Windows Store應用程序或WinRT庫中捕獲Exception
,我們如何才能遵循這些策略?
順便說一句:Clemens Vasters shows in his blog how we can catch Exception while avoiding to catch fatal exception。我假設趕上Exception
不再是壞代碼。
對於鏈接的博客條目,託管代碼無法捕獲許多列出的「致命」異常。值得注意的是,'StackOverflowException',雖然我相當確定AVs不能被捕獲(兩者都可以在本地代碼中捕獲,當然,但這樣做是危險的)。還要注意的是,_appear_致命的一些例外事實上可能並非如此。例如,當特定緩衝區中的空間耗盡時,許多COM組件返回'E_OUTOFMEMORY'。該HRESULT將被轉換爲OutOfMemoryException,但這並不意味着該進程已經耗盡了其整個地址空間。 –