世界最大級のオンライン学習サービス「Udemy(ユーデミー)」とは?

【Flutter/Dart】例外処理とは?try..catch・finally・throw

今回はDart言語における「例外処理」の概念と使い方について解説していきます。

プログラミング初心者でも理解しやすい内容になっているのでぜひ最後までご覧ください。

目次

プログラミング言語における「例外処理」とは?

まずはプログラミング言語における例外処理とは何かについて順を追って解説していきます。

例外処理とはズバリ「プログラムを中断してしまう想定しない例外に対し対策する」ことです。

もし例外処理をせずに例外が発生してしまった場合プログラムが中断される恐れがありますが、例外処理をしておくことで想定とは異なる事象が発生した場合に代わりとなる処理を実行できます。

「例外」と「エラー」の違いとは?

例外処理の解説をしていく上でややこしい「例外」と「エラー」の違いについて触れておきます。

プログラミングにおける例外とエラーについて明確な定義はありませんが、一般的にプログラムで対処できる問題を「例外」、プログラムで対処できない問題を「エラー」と区別します。

  • 例外:プログラムで解決できる問題
  • エラー:プログラムで解決できない問題

例外の例として「ゼロで割り算」、「ファイルが見つからない」、「データベースに接続できない」などプログラムで対処できる問題が挙げられます。

一方、エラーの例として「メモリ不足」、「ハードウェアの故障」などプログラムで対処できない(開発者側で対策できない)問題が挙げられます。

例外処理の流れ

例外処理の基本構文はtry..catch文で、tryブロックで例外が発生する可能性のある処理、catchブロックで実際に例外が発生した場合の処理を書きます。

またtry..catch文にon文, throw文, finally文を組み合わせることでより複雑な例外処理が可能になります。それではDart言語における例外処理の使い方を解説していきます。

try..catch文

try..catch文では「tryブロック」で例外が発生する可能性のある処理、「catchブロック」で実際に例外が発生した場合の処理を書きます。

「catchブロック」の例外識別子eでは例外のデータ「例外オブジェクト(Exeption Object)」を保持できます。

//書き方
try {
  例外が発生する可能性のある処理..
} catch (e) {
  例外が発生した場合の処理..
}

try..catch文の使用例

次のtry..catch文では「tryブロック」で整数をゼロで割ることで例外が発生しているため、「catchブロック」の処理が実行されます。

また「catchブロック」の例外識別子eには例外オブジェクトIntegerDivisionByZeroExceptionが代入されます。

//使用例
void main() {
  int x = 10;
  int y = 0;

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

///出力結果
//IntegerDivisionByZeroException

on文

先ほど解説したtry..catch文では「tryブロック」で何かしらの例外が発生したら「catchブロック」の処理を実行するというものでした。

一方でon文は予め特定できる例外に対して処理を指定できます。

//書き方
try {
  例外が発生する可能性のある処理..
} on 例外オブジェクト {
  指定した例外が発生した場合の処理..
}

また「onブロック」に「catchブロック」を組み合わせて使用したりできます。

//書き方
try {
  例外が発生する可能性のある処理..
} on 例外オブジェクト catch (e){
  指定した例外が発生した場合の処理..
}

on文の使用例

次のtry..on文では例外IntegerDivisionByZeroExceptionが発生する可能性があるので「onブロック」で例外発生時の処理を指定しています。

//使用例
void main() {
  int x = 10;
  int y = 0;

  try {
    print(x ~/ y);
  } on IntegerDivisionByZeroException {
    print('整数をゼロで割ることはできません');
  }
}

///出力結果
//整数をゼロで割ることはできません

finally文

finally文では例外が発生しない場合、発生した場合のいずれの場合でも必ず実行する処理を指定できます。

//書き方
try {
  例外が発生する可能性のある処理..
} catch (e){
  例外が発生した場合の処理..
}finally {
  必ず実行する処理..
}

finally文の使用例

//使用例
void main() {
  int x = 10;
  int y = 0;

  try {
    print(x ~/ y);
  } catch (e) {
    print(e);
  } finally {
    print('必ず実行');
  }
}

///出力結果
//IntegerDivisionByZeroException
//必ず実行

throw文

throw文では任意のタイミングで例外を発生(スロー)できます。

throwの書き方説明
throw Exception(‘メッセージ’);Exceptionの例外を任意のタイミングでスローできます
throw 存在する例外(‘メッセージ’);存在する例外を任意のタイミングでスローできます
throw ‘メッセージ’;任意のメッセージのみスローできます

throw文の使用例

//使用例
void main() {
  int x = 10;
  int y = 0;

  try {
    if (y == 0) {
      throw Exception('0で割り算できません');
    } else {
      print(x ~/ y);
    }
  } catch (e) {
    print(e);
  }
}

///出力結果
//Exception: 0で割り算できません

まとめ

今回はDart言語における「例外処理」の基本的な使い方について解説しました。

参考サイト

目次