1、簡(jiǎn)介
Dart 代碼可以拋出異常和捕獲異常劳闹。異常表示一些未知的錯(cuò)誤情況院究。如果異常沒有被捕獲锣披,則異常會(huì)拋出纸俭,導(dǎo)致拋出異常的代碼終止執(zhí)行膀篮。
Dart 中的所有異常是非檢查異常增淹。方法不會(huì)聲明它們拋出的異常,也不要求捕獲任何異常裤翩。
Dart 提供了 Exception忘衍、Error 以及一些子類型蛹稍,也可以定義自己的異常類型位他。此外 Dart 程序可以拋出任何非 null 對(duì)象,不僅限 Exception 和 Error 對(duì)象产场。
2鹅髓、異常處理
1、throw
/// 拋出類型
throw FormatException('Expected at least 1 section’);
/// 拋出任意對(duì)象
throw 'Out of llamas!’;
2京景、catch
捕獲異沉耄可以避免異常繼續(xù)傳遞(除非重新拋出( rethrow )異常)∪丰悖可以通過捕獲異常的機(jī)會(huì)來處理該異常醒串。
示例一:
try {
} catch (e) {
}
示例二
try {
} on OutOfLlamasException {
// 一個(gè)特殊的異常
} on Exception catch (e) {
// 其他任何異常
} catch (e) {
// 沒有指定的類型,處理所有異常
}
注:捕獲語句中可以同時(shí)使用 on
和 catch
鄙皇,也可以單獨(dú)分開使用芜赌。使用 on
來指定異常類型,使用 catch
來 捕獲異常對(duì)象伴逸。
示例三
try {
// ···
} on Exception catch (e) {
print('Exception details:\n $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
}
注:catch()
函數(shù)可以指定1到2個(gè)參數(shù)缠沈,第一個(gè)參數(shù)為拋出的異常對(duì)象,第二個(gè)為堆棧信息 ( 一個(gè) StackTrace 對(duì)象 )。
示例四
void misbehave() {
try {
dynamic foo = true;
print(foo++); // Runtime error
} catch (e) {
print('misbehave() partially handled ${e.runtimeType}.');
rethrow; // Allow callers to see the exception.
}
}
void main() {
try {
misbehave();
} catch (e) {
print('main() finished handling ${e.runtimeType}.');
}
}
注:如果僅需要部分處理異常洲愤,那么可以使用關(guān)鍵字 rethrow 將異常重新拋出颓芭。
3、finally
不管是否拋出異常柬赐,finally 中的代碼都會(huì)被執(zhí)行亡问。如果 catch 沒有匹配到異常,異常會(huì)在 finally 執(zhí)行完成后肛宋,再次被拋出州藕。
try {
} finally {
//無論是否有異常,都會(huì)執(zhí)行
}
try{
}catch(e){
}finally{
}