はじめに
Dartにおいてtry-catch構文でエラーハンドリングを行う際、
try {
// 処理
} catch(Error e) {
// エラー処理
}
ではなく、
try {
// 処理
} catch(e) {
// エラー処理
}
と書くのか疑問に思ったことはありませんか?
思いますよね。少なくとも私は思いました。
なので、調べてみた知見を共有しようと思います。
なぜcatch(e){ }なのか
これは、Dartの特性に由来するようで、Dartではnullでない全てのオブジェクトがthrowできるため、catch文に入ってくる例外はObject型になります。
したがって、エラー処理を行う際には特定のエラー型を指定するのではなく、catch(e)のように一般的な形式を使用することで、全ての例外をキャッチすることが可能となります。
これにより、例外がError型に限らず、他のオブジェクト型であっても柔軟にハンドリングできるのです。
例えばこんなコードを考えてみましょう
try {
// 任意の処理
throw 'これはエラーメッセージです';
} catch(e) {
print(e);
}
この例では、文字列リテラルが例外として投げられています。
catchブロックで捕捉される例外はObject型であり、文字列リテラルもDartのObject型の一部であるため、正しく拾われ、エラーメッセージが表示されます。
このように、Dartではnullでない全てのオブジェクトがthrowできるという特性があるため、catchブロックではObject型の例外を受け取ることがデフォルトとなっているようです。
さいごに
Dartでのエラーハンドリングは、全てのオブジェクトが例外としてスローできて柔軟性があります。
この特性を知っているとちょっと開発がスムーズに進むかもしれません。
この記事が誰かのお役に立てれば幸いです。
それでは。