有很多重载函数, 但思路基本上就是向 COMPlusThrow 传入某个异常作为参数. 异常类型由 Rexcep.h 中的一系列宏生成, 如 kAmbiguousMatchException, kApplicationException 等类型.(重载函数) 的其他参数指定资源和替代性文字. 可以参考报告了类似异常的代码来选择异常类型.
以下是一些预定义的异常变种:
COMPlusThrowOOM();
最终调用 ThrowOutOfMemory() 函数, 其抛出 C++ 的 OOM(内存不足) 异常. 它抛出一个预先创建的异常, 因为不能在内存不足的情况下再找出内存创建这个异常!
当获取这个异常对应的托管异常时, CLR 首先会尝试分配一个新托管对象 [1], 如果失败的话, 那么就返回一个预先分配的, 全局共享的内存不足异常对象.
[1] 毕竟, 如果申请分配 2G 大小的数组失败, 申请一个小对象还是可以试试的.
COMPlusThrowHR(HRESULT 问题 HR);
如果你有 IErrorInfo 的话, 有很多重载可用. 还有一些惊人复杂的代码来指出一个 HRESULT 值对应哪种异常:
COMPlusThrowWin32(); / COMPlusThrowWin32(hr);
基本上是从 Win32 错误返回值抛出异常: HRESULT_FROM_WIN32(GetLastError())
COMPlusThrowSO();
抛出一个堆栈溢出 (SO) 异常. 注意这个不是一个硬性的堆栈溢出, 只是在可能导致硬性堆栈溢出的时候抛出的异常.
跟内存不足异常 (OOM) 类似, 其抛出一个预先分配的 C++ 堆栈溢出异常. 跟 OOM 不同, 当获取托管异常对象时, CLR 总是返回预先分配的, 全局共享的堆栈溢出异常对象.
COMPlusThrowArgumentNull()
抛出 "参数不能为空" 异常的辅助函数.
COMPlusThrowArgumentOutOfRange()
如名所示.
COMPlusThrowArgumentException()
另一个无效参数相关的异常.
COMPlusThrowInvalidCastException(thFrom, thTo)
传入强制转换的源类型和目的类型, 这个函数可以返回一个相当不错的异常消息.
EX_THROW
这个是非常底层的抛出异常的函数, 普通代码基本不用. 很多 COMPlusThrowXXX 函数在内部使用 EX_THROW, 跟其它特定的 ThrowXXX 函数类似. 最好少用 EX_THROW, 尽量使用封装好的函数以隐藏异常机制的细节. 当然, 如果没有合适的 Throw 函数可用, 使用 EX_THROW 是可以接受的.
这个宏接受两个参数, 要抛出的异常类型 (C++ Exception 类的某些子类), 和用括号括起来的传递给该类型异常的构造函数的参数列表.
来源: http://www.bubuko.com/infodetail-3282664.html