アプリ開発日誌
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開発導入のファシリテーターとして、勉強会などを担当している。