try语句块和异常处理(throw)
異常處理包括
throw表達式,異常檢測使用throw表達式來表示它遇到了無法處理的問題。我們說throw引發(raise)了異常。
try語句塊,異常處理部分使用了try語句塊處理異常。try語句塊以關鍵字try開始,并以一個或多個catch子語句結束。try語句塊中拋出的異常通常會被某個catch子語句處理。
一套異常類,以用在throw表達式和相關的catch子語句之間傳遞異常的處理信息。
throw表達式
程序的異常檢測使用部分使用throw表達式引發一個異常。throw表達式包含關鍵字throw和緊隨其后的一個表達式,其中表達式的類型就是拋出的異常類型。
舉個簡答的例子
Sales_item item1, item2;
cin >> item2 >> item2;
// 首先檢查item1和item2是否表示同一種書籍
if (item1.isbn() == item2.isbn()){
cout << item1 + item2 << endl;
return 0;
}
else{
cerr << "Data must refer to same ISBN" << endl;
return -1;
}
在真實的程序中應該把對象相加的代碼和用戶交互的代碼分離開來。
此例中,我們改寫程序使得檢查完成后不再直接輸出一條信息,而是拋出一個異常:
if (item1.isbn() != item2.isbn()){
throw runtime_error("Data must refer to same ISBN");
}
// 如果程序執行到了這里,表示兩個ISBN是一樣的
cout << item1 + item2 << endl;
在這段代碼中,如果ISBN號不一樣就拋出一個異常,該異常的類型是runtime_error的對象。
拋出異常將終止當前的函數,并把控制權轉移給能處理該異常的代碼。
try語句塊
在前面的例子中,我們使用了一個throw表達式以避免把兩個代表不同書籍的Sales_item相加。
程序本來要執行的任務出現在try語句塊中,這是因為這段代碼可能會拋出一個runtime_error類型的異常。
while (cin >> item1 >> item2){
try{
// 執行添加兩個Sales_item對象的代碼
// 如果添加失敗,代碼拋出一個runtime_error異常
}catch (runtime_error err){
// 提醒用戶兩個ISBN必須一致
cout << err.what()
<< "
Try Again? Enter y or n" << endl;
char c;
cin >> c;
if (!cin || c == 'n')
break;
}
}
try語句塊對應一個catch子語句,該子語句負責處理類型為runtime_error的異常。
如果try語句塊的代買拋出了runtime_error異常,接下來執行catch塊內的語句。
給用戶的提示信息中輸出了err.what()的返回值。what是runtime_error的一個成員函數。每個標準庫異常都定義了名為what的成員函數,這些函數沒有參數,返回值是C風格的字符串。
標準異常
總結
以上是生活随笔為你收集整理的try语句块和异常处理(throw)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 产品经理十二时辰:内容过于真实,扎心了!
- 下一篇: VUE基础之:visible.sync-