Я хотел бы инкапсулировать ошибки 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