Dart(2.2) - 異常(Exceptions)

異常(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 部分可了解更多。

參考

Dart

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容