我想将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
GetLastError()
的值创建一个抛出异常的工厂;但说实话,我只见过这个问题被如下处理:http://code.google.com/p/synergy-plus/source/browse/trunk/lib/arch/XArchWindows.cpp - Nick Bolton