異常

2020-02-03 23:27 更新

Dart 代碼可以拋出和捕獲異常。 異常表示一些未知的錯誤情況。 如果異常沒有被捕獲, 則異常會拋出, 導(dǎo)致拋出異常的代碼終止執(zhí)行。

和 Java 有所不同, Dart 中的所有異常是非檢查異常。 方法不會聲明它們拋出的異常, 也不要求捕獲任何異常。

Dart 提供了 Exception 和 Error 類型, 以及一些子類型。 當(dāng)然也可以定義自己的異常類型。 但是,此外 Dart 程序可以拋出任何非 null 對象, 不僅限 Exception 和 Error 對象。


throw

下面是關(guān)于拋出或者 引發(fā) 異常的示例:

throw FormatException('Expected at least 1 section');

也可以拋出任意的對象:

throw 'Out of llamas!';

提示: 高質(zhì)量的生產(chǎn)環(huán)境代碼通常會實現(xiàn) Error 或 Exception 類型的異常拋出。

因為拋出異常是一個表達(dá)式, 所以可以在 => 語句中使用,也可以在其他使用表達(dá)式的地方拋出異常:

void distanceTo(Point other) => throw UnimplementedError();


catch

捕獲異??梢员苊猱惓@^續(xù)傳遞(除非重新拋出( rethrow )異常)。 可以通過捕獲異常的機(jī)會來處理該異常:

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  buyMoreLlamas();
}

通過指定多個 catch 語句,可以處理可能拋出多種類型異常的代碼。 與拋出異常類型匹配的第一個 catch 語句處理異常。 如果 catch 語句未指定類型, 則該語句可以處理任何類型的拋出對象:

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  // 一個特殊的異常
  buyMoreLlamas();
} on Exception catch (e) {
  // 其他任何異常
  print('Unknown exception: $e');
} catch (e) {
  // 沒有指定的類型,處理所有異常
  print('Something really unknown: $e');
}

如上述代碼所示,捕獲語句中可以同時使用 on 和 catch ,也可以單獨(dú)分開使用。 使用 on 來指定異常類型, 使用 catch 來 捕獲異常對象。

catch() 函數(shù)可以指定1到2個參數(shù), 第一個參數(shù)為拋出的異常對象, 第二個為堆棧信息 ( 一個 StackTrace 對象 )。

try {
  // ···
} on Exception catch (e) {
  print('Exception details:\n $e');
} catch (e, s) {
  print('Exception details:\n $e');
  print('Stack trace:\n $s');
}

如果僅需要部分處理異常, 那么可以使用關(guān)鍵字 rethrow 將異常重新拋出。

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

不管是否拋出異常, finally 中的代碼都會被執(zhí)行。 如果 catch 沒有匹配到異常, 異常會在 finally 執(zhí)行完成后,再次被拋出:

try {
  breedMoreLlamas();
} finally {
  // Always clean up, even if an exception is thrown.
  cleanLlamaStalls();
}

任何匹配的 catch 執(zhí)行完成后,再執(zhí)行 finally :

try {
  breedMoreLlamas();
} catch (e) {
  print('Error: $e'); // Handle the exception first.
} finally {
  cleanLlamaStalls(); // Then clean up.
}

更多詳情,請參考 Exceptions 章節(jié)。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號