我想封装Win32错误(从GetLastError()返回)以某种形式的异常类。但是,我不希望只有一个Win32异常,而是希望能够获得可用于常见错误的特殊异常,如ERROR_ACCESS_DENIED。C++异常设计模式
例如,我不得不声明如下类别:
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 ::创建工厂方法返回一个WindowsException,然后子类型(潜在的ErrorAccessDeniedException)被分割为基本类型。也就是说,该实例不能是多态的。我不想使用new'd指针,因为这会强制异常处理程序在完成时删除它。
有谁知道可以优雅地解决这个问题的设计解决方案吗?
Billy3
您可以创建一个宏来声明几个不同的异常类型,并根据'GetLastError()'的值创建一个抛出工厂。但说实话,我只见过这样的问题:http://code.google.com/p/synergy-plus/source/browse/trunk/lib/arch/XArchWindows.cpp – 2010-01-11 02:08:35
问题与该解决方案是它不允许您创建特定的catch处理程序 - 对于该类型的所有异常,这是一种单一的异常类型。 – 2010-01-11 02:23:55
你应该通过参考的方式来捕捉你的例外,而不是像上面的代码示例所显示的那样通过价值 – 2010-01-11 07:55:31