アプリ開発日誌
2021.08.06
Flutter開発のためのDart入門(5)例外
例外
前回のDart入門(4)の投稿に続き、今回もDartについて解説していきます。
今回は例外について解説します。
プログラムには予期せぬエラーが発生する場合があります。(数字が入力される想定が数字以外が入力されたときや通信エラーなど)
それを例外と呼び、発生した場合はプログラムが急に終了してしまいます。
(例外が発生することを「例外がスロー(throw)される」といいます)
プログラムを動かし続けるには例外がスロー(発生)された際に、異常終了を防がなければなりません。
そこで例外が起きた場合の対処を記述して、指定した動作をさせるための仕組みがDartには用意されています。
それが例外処理と呼ばれるものです。
これによりプログラムは例外が発生しても終了せず継続して動き続けます。
例外処理には以下の構文があります。
throw
throw
を使うことで例外を発生させることができます。
例外として渡すのは通常、Exception
クラスやError
クラスのサブタイプです。
※クラス、サブタイプについては今後の投稿で説明します。
次のコードは例外を発生させる例です。
void main() { print('throw Exception'); throw Exception(); print('not executed'); }
実行結果
throw Exception Uncaught Error: Exception
Exception
クラスやError
クラス以外をthrow
することもできます。
void main() { print('throw String'); throw 'throw String'; print('not executed'); }
実行結果
throw String Uncaught Error: throw String
try-catch
try – catchを使った例外処理の構文は次のようになります。
try { 例外が発生しそうな処理 } catch () { 例外が発生したときの処理 }
void main() { try { print('1stTry'); throw Exception(); print('2ndTry'); } catch (e) { print('Catch'); print(e); } }
実行結果
1stTry Catch Exception
try
内の処理で例外がthrow
された場合、catch
に入ります。
try
内で発生する可能性のある例外が複数ある場合に対処するため、catch
ブロックは複数定義できます。
任意の型だけをcatch
したい場合は、on
を使います。
catch
の第1引数にはthrow
された例外が、第2引数にはStackTrace
(※スタックトレース)が格納されます。
※スタックトレースとはメモリのスタック領域の内容です
catch
した例外を再度throw
したい場合はrethrow
を使います。
finally
例外がスローされるかどうかに関わらず、必ず実行したい処理を記述するには、 finally
ブロック内に定義します。
try { // ··· } on Exception catch (e) { print('Exception details:\n $e'); } catch (e, s) { print('Exception details:\n $e'); print('Stack trace:\n $s'); rethrow; } finally { // 必ず実行したい処理 }
次回はクラスについて投稿する予定です。
ライタープロフィール
【N】
Webエンジニアの経験を経て、アプリエンジニアとしてEDAに入社。
Flutter開発導入のファシリテーターとして、勉強会などを担当している。