我想将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
发布于 2010-01-11 10:06:52
变化
int DangerousMethod() {
throw WindowsAPI::WindowsException::Create(GetLastError());
}至
int DangerousMethod() {
WindowsAPI::WindowsException::Throw(GetLastError());
}这意味着,不是返回异常然后抛出它(正如您所观察到的,这将是分片的),而是让您的帮助器/工厂方法直接抛出它。
发布于 2010-01-11 10:18:44
更多异常处理背景阅读:http://www.informit.com/articles/article.aspx?p=373339
关于类型切片和重新抛出的说明:
当重新抛出异常e时,更喜欢写为只抛出;而不是抛出e;,因为第一种形式总是保留被重新抛出的对象的多态性。
https://stackoverflow.com/questions/2039529
复制相似问题