C ++异常设计模式

时间:2010-01-11 01:56:34

标签: c++ design-patterns exception-handling

我想在某种形式的异常类中封装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

2 个答案:

答案 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对象。