Dart異常


異常(或異常事件)是在執行程式期間出現的問題。發生異常時,程式的正常流程中斷,程式/應用程式異常終止。

Dart內建異常如下 -

編號 異常 描述
1 DeferredLoadException 延遲庫無法載入時丟擲。
2 FormatException 當字串或某些其他資料沒有預期格式且無法解析或處理時丟擲異常。
3 IntegerDivisionByZeroException 當數位除以零時丟擲。
4 IOException 所有與輸入輸出相關的異常的基礎類別。
5 IsolateSpawnException 無法建立隔離時丟擲。
6 Timeout 在等待非同步結果時發生計劃超時時丟擲。

Dart中的每個異常都是預定義類Exception的子類,必須處理異常以防止應用程式突然終止。

try/on/catch塊

try塊嵌入可能導致異常的程式碼。需要指定異常型別時使用on塊。當處理程式需要異常物件時使用catch塊。

try塊必須緊跟一個on/catch塊或一個finally塊(或兩者之一)。當try塊中發生異常時,控制將轉移到catch

處理異常的語法如下所示 -

try { 
   // code that might throw an exception 
}  
on Exception1 { 
   // code for handling exception 
}  
catch Exception2 { 
   // code for handling exception 
}

以下是要記住的一些要點 -

  • 程式碼段可以有多個on/catch塊來處理多個異常。
  • on塊和catch塊是相互包含的,即try塊可以與on塊和catch塊相關聯。

範例:使用on塊

以下程式分別用變數xy表示的兩個數位。程式碼丟擲異常,因為它嚐試除以0on塊包含處理此異常的程式碼。

main() { 
   int x = 12; 
   int y = 0; 
   int res;  

   try {
      res = x ~/ y; 
   } 
   on IntegerDivisionByZeroException { 
      print('Cannot divide by zero'); 
   } 
}

執行上面範例程式碼,得到以下結果 -

Cannot divide by zero

範例:使用catch塊

在以下範例中,使用了與上面相同的程式碼。唯一的區別是在catch塊(而不是on塊)包含處理異常的程式碼。catch的引數包含在執行時丟擲的異常物件。

main() { 
   int x = 12; 
   int y = 0; 
   int res;  

   try {  
      res = x ~/ y; 
   }  
   catch(e) { 
      print(e); 
   } 
}

執行上面範例程式碼,得到以下結果 -

IntegerDivisionByZeroException

範例:on…catch

以下範例顯示如何使用on...catch塊。

main() { 
   int x = 12; 
   int y = 0; 
   int res;  

   try { 
      res = x ~/ y; 
   }  
   on IntegerDivisionByZeroException catch(e) { 
      print(e); 
   } 
}

執行上面範例程式碼,得到以下結果 -

IntegerDivisionByZeroException

finally塊

finally塊包括應該執行的程式碼,而不管異常的發生。try/on/catch之後無條件執行可選的finally塊。

使用finally塊的語法如下 -

try { 
   // code that might throw an exception 
}  
on Exception1 { 
   // exception handling code 
}  
catch Exception2 { 
   //  exception handling 
}  
finally { 
   // code that should always execute; irrespective of the exception 
}

以下範例說明了finally塊的使用。

main() { 
   int x = 12; 
   int y = 0; 
   int res;  

   try { 
      res = x ~/ y; 
   } 
   on IntegerDivisionByZeroException { 
      print('Cannot divide by zero'); 
   } 
   finally { 
      print('Finally block executed'); 
   } 
}

執行上面範例程式碼,得到以下結果:

Cannot divide by zero 
Finally block executed

丟擲異常

throw關鍵字用於顯式引發異常。應該處理引發的異常,以防止程式突然退出。

引發異常的語法是 -

throw new Exception_name()

範例

以下範例顯示如何使用throw關鍵字丟擲異常 -

main() { 
   try { 
      test_age(-2); 
   } 
   catch(e) { 
      print('Age cannot be negative'); 
   } 
}  
void test_age(int age) { 
   if(age<0) { 
      throw new FormatException(); 
   } 
}

執行上面範例程式碼,得到以下結果 -

Age cannot be negative

自定義異常

如上所述,Dart中的每個異常型別都是內建類Exception的子類。Dart可以通過擴充套件現有異常來建立自定義異常。定義自定義異常的語法如下所示 -

語法:自定義異常

class Custom_exception_Name implements Exception { 
   // can contain constructors, variables and methods 
}

應該明確引發自定義異常,並且應該在程式碼中處理相同的異常。

範例

以下範例顯示如何定義和處理自定義異常。

class AmtException implements Exception { 
   String errMsg() => 'Amount should be greater than zero'; 
}  
void main() { 
   try { 
      withdraw_amt(-1); 
   } 
   catch(e) { 
      print(e.errMsg()); 
   }  
   finally { 
      print('Ending requested operation.....'); 
   } 
}  
void withdraw_amt(int amt) { 
   if (amt <= 0) { 
      throw new AmtException(); 
   } 
}

在上面的程式碼中,定義了一個自定義異常AmtException。如果傳遞的金額不在例外範圍內,則程式碼會引發異常。main函式將函式呼叫包含在try...catch塊中。

程式碼應該產生以下輸出 -

Amount should be greater than zero 
Ending requested operation....