例外是程式在執行期間產生的問題,C++ 例外是指在程式運行時發生的特殊情況,比如嘗試除以零的操作,
例外提供了一種轉移程式控制權的方式,C++ 例外處理涉及到三個關鍵字:try、catch、throw,
- throw: 當問題出現時,程式會拋出一個例外,這是通過使用 throw 關鍵字來完成的,
- catch: 在您想要處理問題的地方,通過例外處理程式捕獲例外,catch 關鍵字用于捕獲例外,
- try: try 塊中的代碼標識將被激活的特定例外,它后面通常跟著一個或多個 catch 塊,
如果有一個塊拋出一個例外,捕獲例外的方法會使用 try 和 catch 關鍵字,try 塊中放置可能拋出例外的代碼,try 塊中的代碼被稱為保護代碼,使用 try/catch 陳述句的語法如下所示:
try
{
// 保護代碼
}catch( ExceptionName e1 )
{
// catch 塊
}catch( ExceptionName e2 )
{
// catch 塊
}catch( ExceptionName eN )
{
// catch 塊
}
如果 try 塊在不同的情境下會拋出不同的例外,這個時候可以嘗試羅列多個 catch 陳述句,用于捕獲不同型別的例外,
小編推薦一個學C語言/C++的學習裙【 712,284,705】【點我入群】,無論你是小白還是進階者,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多干貨和技術資料分享!
拋出例外
您可以使用 throw 陳述句在代碼塊中的任何地方拋出例外,throw 陳述句的運算元可以是任意的運算式,運算式的結果的型別決定了拋出的例外的型別,
以下是嘗試除以零時拋出例外的實體:
double division(int a, int b)
{
if( b == 0 )
{
throw "Division by zero condition!";
}
return (a/b);
}
捕獲例外
catch 塊跟在 try 塊后面,用于捕獲例外,您可以指定想要捕捉的例外型別,這是由 catch 關鍵字后的括號內的例外宣告決定的,
try
{
// 保護代碼
}catch( ExceptionName e )
{
// 處理 ExceptionName 例外的代碼
}
上面的代碼會捕獲一個型別為 ExceptionName 的例外,如果您想讓 catch 塊能夠處理 try 塊拋出的任何型別的例外,則必須在例外宣告的括號內使用省略號 ...,如下所示:
try
{
// 保護代碼
}catch(...)
{
// 能處理任何例外的代碼
}
下面是一個實體,拋出一個除以零的例外,并在 catch 塊中捕獲該例外,
實體
/nusing namespace std;/n /ndouble division(int a, int b)/n{/n if( b == 0 )/n {/n throw /"Division by zero condition!/";/n }/n return (a/b);/n}/n /nint main ()/n{/n int x = 50;/n int y = 0;/n double z = 0;/n /n try {/n z = division(x, y);/n cout << z << endl;/n }catch (const char* msg) {/n cerr << msg << endl;/n }/n /n return 0;/n}","classes":[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet">#include <iostream>
using namespace std;
double division(int a, int b)
{
if( b == 0 )
{
throw "Division by zero condition!";
}
return (a/b);
}
int main ()
{
int x = 50;
int y = 0;
double z = 0;
try {
z = division(x, y);
cout << z << endl;
}catch (const char* msg) {
cerr << msg << endl;
}
return 0;
}
由于我們拋出了一個型別為 const char* 的例外,因此,當捕獲該例外時,我們必須在 catch 塊中使用 const char*,當上面的代碼被編譯和執行時,它會產生下列結果:
Division by zero condition!
C++ 標準的例外
C++ 提供了一系列標準的例外,定義在 <exception> 中,我們可以在程式中使用這些標準的例外,它們是以父子類層次結構組織起來的,如下所示:
?
下表是對上面層次結構中出現的每個例外的說明:
?
定義新的例外
您可以通過繼承和多載 exception 類來定義新的例外,下面的實體演示了如何使用 std::exception 類來實作自己的例外:
/n#include/nusing namespace std;/n /nstruct MyException : public exception/n{/n const char * what () const throw ()/n{/n return /"C++ Exception/";/n }/n};/n /nint main()/n{/n try/n {/n throw MyException();/n }/n catch(MyException& e)/n {/n std::cout << /"MyException caught/" << std::endl;/n std::cout << e.what() << std::endl;/n }/n catch(std::exception& e)/n {/n //其他的錯誤/n }/n}","classes":[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"> #include <iostream> #include <exception> using namespace std; struct MyException : public exception { const char * what () const throw () { return "C++ Exception"; } }; int main() { try { throw MyException(); } catch(MyException& e) { std::cout << "MyException caught" << std::endl; std::cout << e.what() << std::endl; } catch(std::exception& e) { //其他的錯誤 } }
這將產生以下結果:
MyException caught
C++ Exception
在這里,what() 是例外類提供的一個公共方法,它已被所有子例外類多載,這將回傳例外產生的原因,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/265056.html
標籤:其他
上一篇:Java 佇列同步器 AQS
