dart系列之:dart語言中的異常

flydean發表於2021-11-13

簡介

Exception是程式中的異常情況,在JAVA中exception有checked Exception和unchecked Exception。那麼在dart中的情況是不是一樣的呢?一起來看看吧。

Exception和Error

Dart中表示異常的類有兩個,分別是Exception和Error。他們兩個有什麼區別呢?

Exception是由VM或者dart code中丟擲的。

Exception主要用來表示使用者程式編寫過程中產生的異常,是可以定位到的可以解決的異常。通常來說Exception中包含了足夠的資訊來方便使用者來定位異常點。

所以Exception通常是需要被catch的。但是和java不同的是,dart中所有的異常都是unchecked 異常,也就是說dart中的異常並不強制要求被捕獲,是否捕獲異常是由程式設計師自行決定的。

構造一個異常很簡單,如下所示:

Exception("message")

但是dart並不推薦這樣使用,因為這樣構造的異常太過通用了,即使捕獲到這樣的異常,可以獲得資訊也比較少。所以dart推薦丟擲自定義異常,也就是說根據業務需要去建立Exception對應的類,然後根據業務需要進行丟擲。

dart中也有很多Exception的子類,比如FormatException來表示各種不同的異常情形。

同樣的,在JAVA中也是這樣推薦的,不要直接丟擲Exception,而是根據業務需要丟擲自定義的異常。

和JAVA一樣,dart中的Error表示的是一個嚴重的錯誤,Error是應該在程式編寫過程中需要避免的。

dart中的Error並不需要被捕獲,因為發生了Error就表示程式出現了非常嚴重的錯誤,已經無法執行下去了。

所以Error是我們在程式編寫過程中需要避免的。

Throw和catch

如果程式產生了異常,則可以使用Throw語句將其丟擲,然後在合適的地方使用catch進行捕獲。

比如我們throw一個格式異常:

throw FormatException('這是一個格式異常');

但是在dart中,不僅僅可以throw Exception或者Error,任何一個Object都可以throw出去,如下所示:

throw "這是一個異常!";

丟擲的異常可以使用catch來捕獲:

try{
    do something
}catch(e){

}

dart也可以捕獲特定的異常,這種情況用on語句來表示,如下:

try {
  someException();
} on OutOfIndexException {
  // 捕獲特定的異常
  doSomething();
} on Exception catch (e) {
  // 捕獲其他的Exception
  print('其他的異常: $e');
} catch (e) {
  // 處理剩下的異常
  print('剩下的異常: $e');
}

dart中的catch可以指定兩個引數,第一個引數就是throw的異常,第二個引數是StackTrace物件:

try {
} catch (e, s) {
  print('異常資訊: $e');
  print('堆疊資訊: $s');
}

在處理完異常之後,如果想要再將其丟擲,可以使用rethrow:

void doSomething(){
    try{
    }catch (e) {
    print('get exception');
    rethrow; // rethrow這個異常
  }
}

Finally

和JAVA一樣,dart中也有Finally,用來進行最終的處理。Finally會在所有的catch語句執行完畢之後執行:

try {
  doSomething();
} catch (e) {
  print('Error: $e'); 
} finally {
  cleanUpJob(); // 最後的清理工作
}

總結

以上就是dart中的異常和對異常的處理。

本文已收錄於 http://www.flydean.com/05-dart-exception/

最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!

相關文章