在c++中,異常的丟擲和處理主要使用了以下三個關鍵字:try、 throw 、 catch.其格式如下:
當我們在程式中想丟擲乙個異常時,可以這樣:
#include
#include
using
namespace std;
intdiv
(int left,
int right)
return left/right;
}
當我們想使用這個函式時,需要在函式外部進行異常的捕獲:
int
main()
catch
(exception & e)
return0;
}
如果存在不同型別的異常,我們可以這樣:
try
catch
(型別名 [形參名]
)catch
(型別名 [形參名]
)catch(.
..)
當我們的程式丟擲異常時,會先暫停當前函式的執行,開始查詢對應匹配的catch語句.
首先會檢查throw是否在**塊內部.
如果是的話,再去找匹配的catch子句.
如果有匹配的,則進行處理.
如果沒有,則退出當前函式棧,繼續在呼叫函式的棧中進行從查詢.
不斷重複上述過程.
如果到達main函式棧,依舊沒有匹配,則直接終止程式.
上述沿著呼叫鏈查詢匹配的catch子句的過程稱之為棧展開.
找到匹配的catch子句並處理以後,會繼續沿著catch子句後面繼續執行.
異常物件型別與catch說明符的型別必須完全匹配,只有以下幾種情況例外:
1.允許從非const物件到const型別物件的轉換.
2.允許派生型別到基類型別的轉換.
3.將陣列轉換為指向陣列型別的指標,將函式轉換為指向函式的指標.
在函式宣告之後,列出該函式可能丟擲異常型別,並保證該函式不會丟擲其他型別的異常.
(因為派生類的虛函式被指向基類型別的指標呼叫時,保證不會違背基類成員函式的異常規範.)
自定義異常型別**:
class
exception
:public exception
public
:virtual
const
char
*what()
const
private
:int _errid;
string _errmsg;
}
測試**:
void
testexception()
intmain()
catch
(exception &e)
}
#include
using
namespace std;
intmy_div
(int a ,
int b)
return a / b;
}int
main()
catch
(const
int temp)
cout <<
"結束"
<< endl;
return0;
}執行結果:
結果:除數為0!
結束
將錯誤資訊封裝為乙個類,乙個try可以匹配多個catch去捕獲不同異常,此時catch括號引數中可以只寫error類。
#include
using
namespace std;
class
error
error
(const
char
*ptr)
error
(const error &other)
} string geterror()
~error()
};intmy_div
(int a ,
int b)
return a / b;
}int
main()
catch
(error &e)
return0;
}
包含異常丟擲語句的函式,若在形參括號後加noexcept,預設產生異常不處理(c++11)。 c 異常處理機制
c 異常處理機制 c 異常處理機制是乙個用來有效地處理執行錯誤的非常強大且靈活的工具,它提供了更多的彈性 安全性和穩固性,克服了傳統方法所帶來的問題.異常的丟擲和處理主要使用了以下三個關鍵字 try throw catch 丟擲異常即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到...
c 異常處理機制
c 異常處理機制是乙個用來有效地處理執行錯誤的非常強大且靈活的工具,它提供了更多的彈性 安全性和穩固性,克服了傳統方法所帶來的問題.異常的丟擲和處理主要使用了以下三個關鍵字 try throw catch 丟擲異常即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異...
C 異常處理機制
c 異常處理機制主要使用try,throw,catch三大關鍵字。try catch語句形式如下 require redcarpet markdown redcarpet.new hello world puts markdown.to htmltry catch exception1 ex 捕獲型...