異常(Exceptions)
你的Dart代碼可以拋出異常和捕獲異常。異常就是出現(xiàn)預(yù)期之外的結(jié)果的錯(cuò)誤。如果沒有捕獲異常, isolate 將會(huì)使異常掛起,往往會(huì)導(dǎo)致 isolate和程序終止。
與java相反,Dart中所有異常都是不需檢測的異常。方法并不會(huì)聲明它將拋出哪些異常,而且你不需要去捕捉任何異常。
Dart 除了提供 異常、錯(cuò)誤 類型以外還提供了眾多預(yù)定義的子類型。當(dāng)然,你可以定義你自己的異常類型。畢竟,Dart程序可以將任何非空對(duì)象作為異常拋出,不只局限與異常和錯(cuò)誤對(duì)象。
Throw拋出異常
這里拋出了一個(gè)異常:
throw FormatException('Expected at least 1 section');
你也可以將任意對(duì)象作為異常拋出:
throw 'Out of llamas!';
由于拋出異常是一個(gè)表達(dá)式,所以可以在 => 語句中使用,也可以在其他能使用表達(dá)式的地方拋出異常。
void distanceTo(Point other) => throw UnimplementedError();
Catch 捕獲異常
捕獲了一個(gè)異常后,就停止了捕獲異常過程。捕獲一個(gè)異常,你就有機(jī)會(huì)去處理它:
try {
breedMoreLlamas();
} on OutOfLlamasException {
buyMoreLlamas();
}
為了處理含有多種類型異常的代碼,你可以選擇多個(gè)catch子句。第一個(gè)匹配拋出對(duì)象類型的catch子句將會(huì)處理這個(gè)異常。如果catch子句未說明所捕獲的異常類型,這個(gè)子句就可處理任何被拋出的對(duì)象。
try {
breedMoreLlamas();
} on OutOfLlamasException {
// A specific exception
buyMoreLlamas();
} on Exception catch (e) {
// Anything else that is an exception
print('Unknown exception: $e');
} catch (e) {
// No specified type, handles all
print('Something really unknown: $e');
}
如之前代碼所示,你可以使用on或者catch來聲明捕獲語句,也可以 同時(shí)使用。使用on來指定異常類型,使用catch來捕獲異常對(duì)象。
函數(shù) catch() 可以帶有一個(gè)或者兩個(gè)參數(shù), 第一個(gè)參數(shù)為拋出的異常對(duì)象, 第二個(gè)為堆棧信息 (一個(gè) StackTrace 對(duì)象)。
try {
// ···
} on Exception catch (e) {
print('Exception details:\n $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
}
使用rethrow關(guān)鍵字可以把捕獲的異常給重新拋出
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}.');
}
}
Finally
為了確保不論是否拋出異常,代碼都正常運(yùn)行,請(qǐng)使用finally子句。如果沒有catch匹配子句的異常, finally子句運(yùn)行以后異常將被傳播:
try {
breedMoreLlamas();
} finally {
// Always clean up, even if an exception is thrown.
cleanLlamaStalls();
}
在匹配了所有catch之后,子句finally運(yùn)行了。
try {
breedMoreLlamas();
} catch (e) {
print('Error: $e'); // Handle the exception first.
} finally {
cleanLlamaStalls(); // Then clean up.
}
通過閱讀 Exceptions 部分可了解更多。