我想在某种形式的异常类中封装Win32错误(从GetLastError()返回的错误).但是,我不想拥有单个Win32异常,而是希望能够针对常见错误(例如ERROR_ACCESS_DENIED)捕获特殊异常.
例如,我有像这样声明的类:
class WindowsException : public std::exception { public: static WindowsException Create(DWORD lastError); //blah }; class ErrorAccessDeniedException : public WindowsException { public: //blah };
但是,我希望Win32异常负责选择正确的异常返回.也就是说,异常的投掷者应该看起来像:
int DangerousMethod() { throw WindowsAPI::WindowsException::Create(GetLastError()); }
捕手可能看起来像:
try { DangerousMethod(); } catch(WindowsAPI::ErrorAccessDeniedException ex) { //Code for handling ERROR_ACCESS_DENIED } catch(WindowsAPI::WindowsException ex) { //Code for handling other kinds of error cases. }
我的问题是,如果WindowsException :: Create工厂方法返回一个WindowsException,那么子类型(可能是ErrorAccessDeniedException)将被切分为基类型.也就是说,实例不能是多态的.我不想使用new’d指针,因为这会强制异常处理程序在完成时删除它.
Billy3
解决方法
更改
int DangerousMethod() { throw WindowsAPI::WindowsException::Create(GetLastError()); }
至
int DangerousMethod() { WindowsAPI::WindowsException::Throw(GetLastError()); }
意思是,而不是返回异常然后抛出它(它将切片,如你所观察到的),让你的助手/工厂方法直接抛出它.