之前在刷 leetcode 時用到了異常處理,記錄一下。
一般來說 c++ 的庫函式呼叫時,如果發生引數使用不當,或引數超限等,程式會直接丟擲異常而終止執行,但這並不是我們想要的結果,我們往往希望當出現異常時,再對異常進行特殊處理進而完善程式,使程式繼續執行。
在 leetcode myatoi() 一題中,要求實現字串轉數字,但是這裡的字串轉數字要比 標準庫中的std::stoi()
函式考慮的情況更多!所以直接省懶勁,能用stoi()
轉換的直接轉換,對於stoi()
不能處理的字串再進行特殊處理。
源**片段:
else
res =
stoi
(str)
;
這樣寫的話,顯然如果stoi()
無法轉換則程式會直接丟擲異常,stoi()
丟擲的異常有兩種(參見官方文件):
else
catch
(const std::exception& e)
// 捕獲異常,這裡用的是 std::exception,即未指明具體異常型別,適用於只想捕獲異常,而不做相應處理的情況
}
上面提到stoi()
會丟擲兩種異常,我們可以根據這兩種異常做相應處理:
else
catch
(const std::invalid_argument& e)
// 捕獲 std::invalid_argument 異常
catch
(const std::out_of_range& e)
// 捕獲 std::out_of_range 異常
}
try 往往和 catch 搭配使用,catch 可以有多個,但至少要有乙個。需要注意的是 try 語句塊內宣告的變數在塊外部無法訪問(即使是在 catch 子句內也不行)!
以除法除以零為例:你可以丟擲 c++ 中的標準異常型別(runtime_error 為例)
#include
using
namespace std;
intmain()
catch
(const runtime_error &e)
return0;
}
也可以自定義異常型別:
try
catch
(int e)
// 這裡用 e 來接收 a 的值
C 異常丟擲與捕獲及處理
c 異常丟擲與捕獲及處理 一 異常 迄今為止,我們處理程式中的錯誤一般都是用if語句測試某個表示式,然後處理錯誤的特定義 c 異常機制 使用了三個新的關鍵字 seh 結構化 異常處理 try 標識可能出現的異常 段 throw 丟擲乙個異常 catch 標識處理異常的 段 使用異常處理將帶來更多的系...
c 異常處理,異常宣告,捕獲異常
c 捕獲異常的一些規則 1 非mfc 的c 異常應該用過引用來捕獲。使用引用來捕獲異常不需要刪除c 異常物件。因為使用引用捕獲的異常物件會在棧中傳遞。而且保持了多型性,使得你捕獲的異常正是你丟擲的異常物件。使用指標捕獲異常的話,需要你刪除異常物件。使用值捕獲的話,會導致物件的slicing 問題。更...
iOS常用捕獲異常及處理方法
使用 try catch捕獲異常 try catch n ception exception finally 有時候崩潰我們是無法避免的,因此我們可以在程式崩潰之前做一些 動作 收集錯誤資訊 下面的例子是把捕獲到的異常傳送至開發者的郵箱。來自garveycalvin的部落格 nssetuncaugh...