EX_TRY 宏就是引入 try 块, 很像 C++ 的 "try", 除了其还添加了一个大括号:"{".
EX_CATCH
EX_CATCH 宏结束一个 try 块, 并添加一个大括号:"}", 并且开始 catch 块. 跟 EX_TRY 类似, 其也添加了一个大括号来开始 catch 块.
这里和 C++ 异常有很大的不同: CLR 开发者根本不明确捕捉什么. 实际上, 这些宏捕捉包括类似 AV 的非 C++ 异常或托管异常的任何东西. 如果一块代码只需要捕捉一个或者一小部分异常, 那么它需要捕捉并检查异常, 然后将所有不相关的异常再次抛出.
需要再次指明的是 EX_CATCH 宏捕捉任何东西. 这个可能不是一个函数需要的. 下两个章节讨论如何处理不应该被捕捉的异常.
GET_EXCEPTION() & GET_THROWABLE()
当一个 CLR 开发人员捕捉到一个东西, 那么他要如何决定做什么? 取决于需求, 有几个选项:
第一, 无论捕捉到什么 (C++) 异常, 都是继承自全局的 Exception 类的类的实例. 一些继承类很明显, 如 OutOfMemoryException. 另一些则有些领域相关, 如 EETypeLoadException. 还有些类只是系统异常的简单封装, 如 CLRException(包含 OBJECTHANDLE 字段指向一个托管异常), 或 HRException(HRESULT 的封装). 如果最初的异常不是从 Exception 继承来的, 那么宏会给其做一个封装.(注意所有异常都是系统自带而且众所周知的).
第二, 每个 CLR 内部异常都有一个关联的 HRESULT 值. 有时像 HRException 那样, 值从某个 COM 对象来的, 但内部异常和 Win32 API 错误值也有 HRESULT 值.
最后, 几乎所有 CLR 内部发生的异常都有可能传递到托管代码那边, CLR 内部异常都有跟其对应的托管异常. 创建托管异常不是必须的, 但是总有办法获取它.
那么, CLR 开发人员将如何给一个异常分类呢?
常用的做法是, 通过异常关联的 HRESULT 值分类, 而且有一个很简单的办法取值:
HRESULT hr = GET_EXCEPTION()->GetHR();
来源: http://www.bubuko.com/infodetail-3282651.html