2012-02-29 95 views
1

在我的應用程序中使用不同的開源庫,引發了不同的異常。 我沒有處理異常處理方面的經驗,我總是做了try/catch事情,當我知道
有問題。 現在我喜歡構建一些處理其中所有異常的對象。我沒有知道如何開始,即使它可能
例如,我有我的類和B類C++如何處理泛型異常對象的所有類型的異常?

Class A 
{ 
void method1() 
{ 
    Foo foo = new foo // external lib throws throw std::bad_alloc(); 
} 
}; 

Class B 
{ 
Void method1() 
{ 
    Int d = m_foo[0] // external lib throw std::runtime_error(message); 
} 
}; 

我想以某種方式來處理這些類型和其他人在中心位置在我的應用程序 什麼應該使用策略嗎?

UPDATE:
努力的建議提出,並在主我的應用程序的實現的try/catch後,問題就永遠不會有異常時拋出的所有IM得到的是這一點,但它從來沒有得到的試/ catch:
visual studio run time error

+1

這個錯誤發生是因爲一個叫assert()的指令。這個結構會在它的括號之間獲得一個有條件的表達式,並且如果它變成假,它會中止執行並顯示你所看到的對話框。 – Baltasarq 2012-02-29 11:18:17

回答

2

您可以在main()功能使用try... catch結構。 C++標準庫的所有例外都來自std::exception,所以這是一個很好的備份。但是,您應該區分所有不同類型的異常,或者至少那些更常見的異常。您也可以創建自己的例外,即從std::runtime_error派生的類。你可以有多個捕獲部分,但從更具體的更具體的一個訂購。

try { 

// more things... 

} 
catch(const std::bad_alloc &ba) 
{ 
    // memory error 
    std::cerr << "Memory error" << std::endl; 
    exit(EXIT_FAILURE); 
} 
catch(const std::runtime_error &re) 
{ 
    // customized error, probably 
    std::cerr << "ERROR: " << re.what() << std::endl; 
    exit(EXIT_FAILURE); 
} 
catch(const std::exception &e) 
{ 
    // general (unexpected) error 
    std::cerr << "Unexpected ERROR: " << e.what() << std::endl; 
    exit(EXIT_FAILURE); 
} 

記住,你需要#包括stdexceptexception。 希望這有助於。

+0

究竟什麼是異常類的像這個鏈接的好處: http://www.cplusplus.com/doc/tutorial/exceptions/ – user63898 2012-02-29 08:56:27

+0

你給出該鏈接使用異常的基礎知識。首先,它引入了任何可以作爲異常拋出,然後從標準庫中的異常層次開始。使用異常類而不是數字字符串的好處正是您可以區分拋出的異常類中的所有類型的錯誤。 – Baltasarq 2012-02-29 11:21:05

1

使用catch all/default異常處理程序。
如果使用省略號(...)作爲捕獲的參數,該處理程序將捕獲所有異常:

try 
{ 

} 
catch(...) 
{ 

} 

但是,請注意使用包羅萬象的是一個糟糕的設計,它隱藏了您的問題,相反,您應該專門處理每個例外情況並採取適當的措施。

+1

解答由最後的評論保存! :) – Nim 2012-02-29 08:44:35

0

您可以使用try/catch,捕捉所有異常:

try 
{ 

} 
catch (...) //catches all exceptions 
{ 

} 
0

通常你會使用類似的東西來

#include <stdexcept> 
try { 
    ... 
} catch (std::exception const& e) { 
    // catches std::exception and derived, e.what() can be used to log the root cause 
} catch (...) { 
    // catches anything thrown, not only exceptions 
}