我想封裝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