C异常设计模式

前端之家收集整理的这篇文章主要介绍了C异常设计模式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在某种形式的异常类中封装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());
}

意思是,而不是返回异常然后抛出它(它将切片,如你所观察到的),让你的助手/工厂方法直接抛出它.

猜你在找的C&C++相关文章