我想在某种形式的异常类中封装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
答案 0 :(得分:12)
更改
int DangerousMethod() {
throw WindowsAPI::WindowsException::Create(GetLastError());
}
要
int DangerousMethod() {
WindowsAPI::WindowsException::Throw(GetLastError());
}
意思是,不是返回异常然后抛出它(它会切片,如你所观察到的),让你的帮助器/工厂方法直接抛出它。
答案 1 :(得分:2)
处理背景阅读的更多异常:http://www.informit.com/articles/article.aspx?p=373339
关于类型切片和重新抛出的说明:
当重新抛出异常e时, 喜欢写作只是扔;代替 投掷e;因为第一种形式 总是保留多态性 rethrown对象。