記事の内容
この記事では、Dartの例外処理について説明します。
Exceptionとは何か?
プログラムの実行中に発生するエラーのことを例外といいます。
Dartでは、この例外をExceptionクラスで扱います。
具体的には、こういったことが例外と言われます。
- データベースに接続ができない
- Web APIにアクセスできない
- ファイルシステムのI/Oエラー
Exceptionの種類
実行時エラー
- DeferredLoadException
- FormatException
- IntegerDivisionByZeroException
- IOException
- IsolateSpawnException
- TimeoutException
プログラムに問題があった場合
- AbstractClassInstantiationError
- ArgumentError
- AssertionError
- AsyncError
- CastError
- ConcurrentModificationError
- CyclicInitializationError
- FallThroughError
- JsonUnsupportedObjectError
- NoSuchMethodError
- NullThrownError
- OutOfMemoryError
- RemoteError
- StackOverflowError
- StateError
- UnimplementedError
- UnsupportedError
Exceptionの使用方法
例外を投げるには、「throw」というキーワードを使います。
そして、その例外を捕捉するには、例外が投げられるコードをtryブロックで囲み、それに対応する「catchブロックとonブロック」を記述します。
そして、finallyは、例外が起きても起きなくても必ず実行されます。
なお、tryの中にある「throw」が発生した場合、「throw」以降のプログラムは読み込まれません。
では、実際に例を見ていきたいと思います。
基本的なtryの使い方
正常系の場合
普通に10が表示されます。
エラーが出る場合
10は表示されずに、catch句の中でエラーが表示されます。
エラーの詳細を知りたい場合
catchの第2引数には、スタックトレース(エラーの詳細)を指定することができます。
finally句
エラーが発生する、しないに関わらず実行したい処理がある場合には「finally」を使います。
開いたファイルを閉じたい場合や、DBの接続を切りたい時には、finallyを使うといいかもしれません。
独自の例外クラスを作成する方法
既存の例外クラスを継承して、独自の例外クラスを作成することもできます。
複数の例外クラスを扱う場合には、「on catch」を書く際に必ず子供の例外クラスから書くようにしましょう。
そうしないと、全ての例外を親例外クラスである「Exception」がcatchしてしまうので、細かく例外処理を記述する意味がなくなってしまいます。