例外(または例外イベント)は、プログラムの実行中に発生する問題です。例外が発生すると、プログラムの通常のフローが中断され、プログラム/アプリケーションが例外で終了します。
Dartの組み込みの例外は以下のとおりです。
番号 | 例外 | 説明 |
1 | DeferredLoadException | 遅延ライブラリがロードできない場合にスローされます。 |
2 | FormatException | 文字列またはその他のデータが予期された形式ではなく、解析または処理できない場合、例外がスローされます。 |
3 | IntegerDivisionByZeroException | 数値がゼロで除算されたときにスローします。 |
4 | IOException | 入力と出力に関連するすべての例外の基底クラスです。 |
5 | IsolateSpawnException | 分離を作成できない場合にスローされます。 |
6 | Timeout | 非同期の結果を待っている間にプランのタイムアウトが発生した場合にスローされます。 |
Dartのすべての例外は、事前定義されたクラスException
のサブクラスであり、アプリケーションの突然の終了を防ぐために処理する必要があります。
目次
try/on/catchブロック
tryブロックには、例外を引き起こす可能性のあるコードが埋め込まれています。例外の型を指定する必要がある場合は、on
ブロックを使用します。catch
ブロックは、ハンドラーが例外オブジェクトを必要とする場合に使用されます。
try
ブロックの直後には、on/catch
ブロックまたはfinally
ブロック(またはそのうちの1つ)が続く必要があります。try
ブロックで例外が発生すると、制御はcatch
に移動します。
例外を処理するための構文は以下のとおりです。
try {
// code that might throw an exception
}
on Exception1 {
// code for handling exception
}
catch Exception2 {
// code for handling exception
}
次には覚えるべきいくつかの重要なポイントを挙げます。
- コードセグメントには、複数の例外を処理するために複数の
on
/catch
ブロックを含めることができます。 on
ブロックとcatch
ブロックは相互に含まれています。つまり、try
ブロックをon
ブロックとcatch
ブロックに関連付けることができます。
実例:onブロックを使用する
以下のプログラムでは、それぞれ変数x
とy
で表される2つの数値を使用します。コードは0
で除算しようとしているため、例外をスローします。on
ブロックには、この例外を処理するためのコードが含まれています。
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException {
print('Cannot divide by zero');
}
}
上記のコードを実行した後、出力結果は以下のとおりです。
Cannot divide by zero
実例:catchブロックを使用する
以下の実例では、上記と同じコードが使用されています。唯一の違いは、例外を処理するためのコードがcatch
ブロック(on
ブロックではなく)に含まれていることです。catch
のパラメータには、実行時にスローされる例外オブジェクトが含まれています。
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
catch(e) {
print(e);
}
}
上記のコードを実行した後、出力結果は以下のとおりです。
IntegerDivisionByZeroException
実例:on…catch
以下の実例では、on…catch
ブロックの使用方法を示しています。
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException catch(e) {
print(e);
}
}
上記のコードを実行した後、出力結果は以下のとおりです。
IntegerDivisionByZeroException
finallyブロック
finally
ブロックには、例外の発生に関係がなく、実行する必要のあるコードが含まれています。try/on/catch
の後に、オプションのfinally
ブロックを無条件に実行します。
finally
ブロックを使用するための構文は以下のとおりです。
try {
// code that might throw an exception
}
on Exception1 {
// exception handling code
}
catch Exception2 {
// exception handling
}
finally {
// code that should always execute; irrespective of the exception
}
以下の実例では、finally
ブロックの使い方を示しています。
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException {
print('Cannot divide by zero');
}
finally {
print('Finally block executed');
}
}
上記のコードを実行した後、出力結果は以下のとおりです。
Cannot divide by zero
Finally block executed
例外をスローする
throw
キーワードは、例外を明示的に発生させるために使用されます。発生した例外は、プログラムが突然終了するのを防ぐために処理する必要があります。
例外をスローするための構文は以下のとおりです。
throw new Exception_name()
実例
以下の実例では、throw
キーワードを使用して例外をスローする方法を示しています。
main() {
try {
test_age(-2);
}
catch(e) {
print('Age cannot be negative');
}
}
void test_age(int age) {
if(age<0) {
throw new FormatException();
}
}
上記のコードを実行した後、出力結果は以下のとおりです。
Age cannot be negative
カスタム例外
上記のように、Dartのすべての例外の型は、組み込みクラスException
のサブクラスです。Dartは、既存の例外を拡張することでカスタム例外を作成できます。カスタム例外を定義するための構文は以下のとおりです。
構文:カスタム例外
class Custom_exception_Name implements Exception {
// can contain constructors, variables and methods
}
カスタム例外は明示的に発生させる必要があり、同じ例外をコードで処理する必要があります。
実例
以下の実例では、カスタム例外を定義して処理する方法を示しています。
class AmtException implements Exception {
String errMsg() => 'Amount should be greater than zero';
}
void main() {
try {
withdraw_amt(-1);
}
catch(e) {
print(e.errMsg());
}
finally {
print('Ending requested operation.....');
}
}
void withdraw_amt(int amt) {
if (amt <= 0) {
throw new AmtException();
}
}
上記のコードでは、カスタム例外AmtException
が定義されています。渡された金額が例外の範囲内にない場合、コードは例外を発生させます。main
関数には、try…catch
ブロックに関数呼び出しが含まれています。
コードは以下の結果を出力します。
Amount should be greater than zero
Ending requested operation....
コメントを残す