如果Windows运行时类型引发COM错误,则.NET似乎经常(或总是?)将此错误封装到一个
Exception
实例中。错误消息包括COM HRESULT错误代码。例如,使用新的加密API与AES-CBC时,错误的缓冲区长度会导致带有消息“所提供的用户缓冲区对于请求的操作无效。(HRESULT异常:0x800706F8
)”的Exception
。
那么我们应该如何处理这些异常呢?我们应该从异常中读取HRESULT
代码以了解是什么类型的异常吗?在经典的.NET中,我会得到一个CryptographicException
,我可以用它来区分加密错误和其他错误。
另一件我不明白的事情是,微软的代码质量规则指出,永远不应该抛出Exception
,而应该始终使用派生类型。原因是没有人应该被迫捕获捕获更致命异常的一般Exception
。另一个规则说,在库中永远不要捕获Exception
。如果我们被迫在Windows Store应用程序或WinRT库中捕获Exception
,我们该如何遵循这些政策呢?
顺便说一句:Clemens Vasters在他的博客中展示了如何捕获异常而避免捕获致命异常。我认为,如果我们能够避免捕获致命异常,那么捕获Exception
就不再是坏代码了。
StackOverflowException
,虽然我相当确定 AV 也无法被捕获(当然,在本机代码中可以捕获这两个异常,但这样做很危险)。还要注意,一些看起来“致命”的异常实际上可能并非如此。例如,许多 COM 组件在特定缓冲区中的空间耗尽时返回E_OUTOFMEMORY
。这个 HRESULT 将被翻译为 OutOfMemoryException,但这并不意味着进程已经耗尽了其整个地址空间。 - James McNellis