Dart例外

例外(または例外イベント)は、プログラムの実行中に発生する問題です。例外が発生すると、プログラムの通常のフローが中断され、プログラム/アプリケーションが例外で終了します。

Dartの組み込みの例外は以下のとおりです。

番号例外説明
1DeferredLoadException遅延ライブラリがロードできない場合にスローされます。
2FormatException文字列またはその他のデータが予期された形式ではなく、解析または処理できない場合、例外がスローされます。
3IntegerDivisionByZeroException数値がゼロで除算されたときにスローします。
4IOException入力と出力に関連するすべての例外の基底クラスです。
5IsolateSpawnException分離を作成できない場合にスローされます。
6Timeout非同期の結果を待っている間にプランのタイムアウトが発生した場合にスローされます。

Dartのすべての例外は、事前定義されたクラスExceptionのサブクラスであり、アプリケーションの突然の終了を防ぐために処理する必要があります。

try/on/catchブロック

tryブロックには、例外を引き起こす可能性のあるコードが埋め込まれています。例外の型を指定する必要がある場合は、onブロックを使用します。catchブロックは、ハンドラーが例外オブジェクトを必要とする場合に使用されます。

tryブロックの直後には、on/catchブロックまたはfinallyブロック(またはそのうちの1つ)が続く必要があります。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で表される2つの数値を使用します。コードは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ブロック

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....
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です