異常(或異常事件)是在執行程式期間出現的問題。發生異常時,程式的正常流程中斷,程式/應用程式異常終止。
Dart內建異常如下 -
編號 | 異常 | 描述 |
---|---|---|
1 | DeferredLoadException |
延遲庫無法載入時丟擲。 |
2 | FormatException |
當字串或某些其他資料沒有預期格式且無法解析或處理時丟擲異常。 |
3 | IntegerDivisionByZeroException |
當數位除以零時丟擲。 |
4 | IOException |
所有與輸入輸出相關的異常的基礎類別。 |
5 | IsolateSpawnException |
無法建立隔離時丟擲。 |
6 | Timeout |
在等待非同步結果時發生計劃超時時丟擲。 |
Dart中的每個異常都是預定義類Exception
的子類,必須處理異常以防止應用程式突然終止。
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塊
以下程式分別用變數x
和y
表示的兩個數位。程式碼丟擲異常,因為它嚐試除以0
。on
塊包含處理此異常的程式碼。
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
塊包括應該執行的程式碼,而不管異常的發生。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....