1. 程式人生 > >Dart2基礎(七)

Dart2基礎(七)

目錄

丟擲異常

捕獲異常

Dart2的異常與Java是非常類似的。Dart2的異常是Exception或者Error(包括它們的子類)的型別,甚至可以是非Exception或者Error類,也可以丟擲,但是不建議這麼使用。

Exception主要是程式本身可以處理的異常,比如:IOException。我們處理的異常也是以這種異常為主。

Error是程式無法處理的錯誤,表示執行應用程式中較嚴重問題。大多數錯誤與程式碼編寫者執行的操作無關,而表示程式碼執行時 DartVM出現的問題。比如:記憶體溢位(OutOfMemoryError)等等。

與Java不同的是,Dart2是不檢測異常是否宣告的,也就是說方法或者函式不需要宣告要丟擲哪些異常。

  • 丟擲異常

使用throw丟擲異常,異常可以是Excetpion或者Error型別的,也可以是其他型別的,但是不建議這麼用。另外,throw語句在Dart2中也是一個表示式,因此可以是=>。

// 非Exception或者Error型別是可以丟擲的,但是不建議這麼用
testException(){
    throw "this is exception";
}
testException2(){
    throw Exception("this is exception");
}

// 也可以用 =>
void testException3() => throw Exception("test exception");
  • 捕獲異常

使用on可以捕獲到某一類的異常,但是獲取不到異常物件; catch可以捕獲到異常物件。這個兩個關鍵字可以組合使用。

rethrow可以重新丟擲捕獲的異常。

testException(){
  throw FormatException("this is exception");
}

main(List<String> args) {
  try{
    testException();
  } on FormatException catch(e){ // 如果匹配不到FormatException,則會繼續匹配
    print("catch format exception");
    print(e);
    rethrow; // 重新丟擲異常
  } on Exception{ // 匹配不到Exception,會繼續匹配 
   print("catch exception") ;
  }catch(e, r){ // 匹配所以型別的異常. e是異常物件,r是StackTrace物件,異常的堆疊資訊
    print(e);
  }
}
  • finally

finally內部的語句,無論是否有異常,都會執行。

testException(){
  throw FormatException("this is exception");
}

main(List<String> args) {
  try{
    testException();
  } on FormatException catch(e){
    print("catch format exception");
    print(e);
    rethrow;
  } on Exception{
   print("catch exception") ;
  }catch(e, r){ 
    print(e);
  }finally{
    print("this is finally"); // 在rethrow之前執行
  }
}