【Flutter/Dart】例外処理の使い方|try/on/catch/e/throw/finally

例外処理
スポンサーリンク

Exception(例外)とは?

Exception(例外)とは、プログラムの実行中における想定内のエラーで、プログラムで対処可能なエラーのことを呼びます。

>>【Flutter/Dart】Exception/Errorの区別と種類

例外処理とは?

例外処理

例外処理を使えば、プログラム実行中にExceptionが発生しなかった場合と、発生した場合で処理を分けることができます。また、Exceptionが発生する可能性のある始めの処理を「try」と呼び、Exceptionが発生した場合、次のような処理に移行できます。

  • try-on文:1つのExceptionに対して有効
  • try-catch文:複数のExceptionに対して有効
  • try-on-catch文:try-on文とtry-catch文の複合処理

また、Exceptionを意図的に発生させたり、例外処理の最後に必ず実行する処理を指定したりできます。

  • throw:Exceptionを意図的に発生させる
  • finally:Exceptionの発生の有無に関わらず例外処理の最後に必ず実行

try-on文

try-on

try-on文は、tryブロックで発生する1つのExceptionに対して例外処理を実行できます。(onブロックで対処するExceptionを指定します)

try-on文の定義

//定義
try{
  (Exceptionが発生する可能性のある処理)
}on Exception名{
  (指定したExceptionが発生した時の処理)
}
//例
void main() {
  String words = 'Hello World';
  try{
    print(int.parse(words));
  }on FormatException{
    print('FormatException 発生');
  }
}

//出力
//FormatException 発生

この例では、String型のwordsをint.parseを使ってint型に変換できなかったため、tryブロックでFormatExceptionが発生しています。ただ、onブロックでFormatExceptionを指定しているので対処が可能です。

>>【Dart】Exception/Errorの区別と種類

try-catch文

try-catch

try-catch文は、tryブロックで発生する全てのExceptionに対して例外処理を実行できます。また、catchブロックの引数に「eまたはexception(どちらでも良い)」を指定します。「e = 全てのExceptionをcatchする」とイメージしておきましょう。

try-catch文の定義

//定義
try{
  (Exceptionが発生する可能性のある処理)
}catch(e){
  (指定したExceptionが発生した時の処理)
}
//例
void main() {
  String words = 'Hello World';
  try{
    print(int.parse(words));
  }catch(e){
    print(e);
    print('tryブロックでException 発生');
  }
}
//出力
//FormatException: Hello World <= print(e)によって出力
//tryブロックでException 発生

try-catch文は、tryブロックで発生した全てのExceptionに有効です。また、catch文の引数に使われる「e」にprint関数を使えばExceptionの情報を出力できます。

try-on-catch文

try-on-catch

try-on-catch文は、try-on文とtry-catch文を複合した例外処理です。よって、tryブロックでExceptionが発生した際、まずonブロックでExceptionをチェックし、指定したExceptionの場合はonブロックで処理を実行し、指定したExceptionで無かった場合はcatchブロックで処理を実行します。

try-on-catch文の定義

//定義
try{
  (Exceptionが発生する可能性のある処理)
}on{
  (指定したExceptionが発生した時の処理)
}catch(e){
  (指定したExceptionが発生した時の処理)
}
//例
void main() {
  String words = 'Hello World';
  try{
    print(int.parse(words));
  }on FormatException{
    print('FormatException 発生');
  }catch(e){
    print(e);
    print('tryブロックでException 発生');
  }
}
//出力
//FormatException 発生

この例では、tryブロックで発生したExceptionが、onブロックで指定したExceptionのため、onプロックの処理が実行されますが、catchブロックは実行されません。

throw

throw

throwを使えば、意図的にExceptionを発生できます。throwはtryブロックのif文などで使われ、throwが実行されるとtryブロックでの処理を中断し、catchブロック(Exception)の処理に移ります。また、throwを使用する際にExceptionとなるエラー文を指定し、指定したエラー文をcatchブロックの「e」で使用できます。

throwの定義

//定義
try{
  ...
  throw 'エラー文を指定' //if文などで使われる
  ... 
}catch(e){
  print(e) //throwで指定したエラー文が出力
  (指定したExceptionが発生した時の処理)
}

tryブロックで直接throwを使う場合

//例
void main() {
  int number = 100;
  try{
    if(number > 50){
      throw '50よりも大きい';
    }
    print(number); //throwが実行されたら実行されない
  }catch(e){
    print(e); //throwで指定したエラー文が出力
    print('カスタムExceptionが発生');
  }
}

//出力
//50よりも大きい
//カスタムExceptionが発生

関数で間接的にthrowを使う場合

//例
void main() {
  int number = 100;
  try{
    greaterThan50(number);
    print(number); //throwが実行されたら実行されない
  }catch(e){
    print(e); //throwで指定したエラー文が出力
    print('カスタムExceptionが発生');
  }
}

void greaterThan50(int num){
  if(num > 50){
      throw '50よりも大きい';
  }
}

//出力
//50よりも大きい
//カスタムExceptionが発生

この例では、関数にthrowを使用し、tryブロックで実装しています。

finally

finally

finallyは、Exceptionの発生の有無に関わらず例外処理の最後に処理を実行したい際に実装します。

finallyの定義

//定義
try{
  (Exceptionが発生する可能性のある処理)
}catch(e){
  (指定したExceptionが発生した時の処理)
}finally{
  (例外処理の最後に実行したい処理)
}
//例
void main() {
  String words = 'Hello World';
  try{
    print(int.parse(words));
  }catch(e){
    print(e);
    print('tryブロックでException 発生');
  }finally{
    print('finallyで処理実行');
  }
}

//出力
//tryブロックでException 発生
//finallyで処理実行

try-on/try-catch/try-on-catch文の最後にfinallyで例外処理の最後に実行したい処理を実行します。

参考

タイトルとURLをコピーしました