'on' による例外のキャッチ
CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 40/65。
基本的な try-catch ブロックは発生するあらゆる例外をキャッチしますが、異なる種類の例外を異なる方法で処理する必要がある場合があります。on キーワードを使用すると、特定の例外タイプをキャッチし、それぞれに対してカスタマイズされたレスポンスを提供できます。
汎用的な catch ですべての例外をキャッチする代わりに、on の後に例外の型を記述することで、特定の例外を対象にすることができます。これにより、さまざまなエラー状況に対してプログラムがどのように応答するかをより詳細に制御できるようになります。
try {
int number = int.parse("abc");
} on FormatException {
print("Please enter a valid number");
}この例では、コードは特に FormatException をキャッチします。これは、無効なテキストを数値として解析しようとしたときに発生します。これにより、ユーザーを混乱させる可能性のある一般的なエラーメッセージを表示するのではなく、問題に直接対処する、明確でユーザーフレンドリーなメッセージを提供できます。
複数の on ブロックを組み合わせて、異なる例外タイプを適切なレスポンスで処理することも可能です。これにより、エラーハンドリングを正確かつユーザーフレンドリーなものにできます。
チャレンジ
簡単onキーワードを使用して特定の例外をキャッチする方法を示すプログラムを作成してください。このプログラムは、さまざまなタイプのユーザー入力を処理し、特定の例外タイプをカスタマイズされたエラーメッセージで処理します。
- 数式のタイプ(
"parse"、"divide"、または"access")を表す文字列入力を読み取ります。 - 最初の値を表す文字列入力を読み取ります。
- (該当する場合)2番目の値を表す文字列入力を読み取ります。
- 式のタイプに基づいて、特定の例外処理を使用して対応する操作を実行します。
"parse"の場合:int.parse()を使用して最初の値を整数に変換し、特にFormatExceptionをキャッチします。"divide"の場合:両方の値を整数としてパースして除算を実行し、パースエラーに対してFormatExceptionをキャッチします。"access"の場合:最初の値を含むリストを作成し、2番目の値で指定されたインデックスにアクセスし、無効なインデックスに対してRangeErrorをキャッチします。- 結果または特定のエラーメッセージを、以下に示す正確な形式で表示します。
例えば、入力が "parse"、"42"、"unused" の場合、プログラムは次のように出力する必要があります。
Operation: parse
Input: 42
Parsing successful!
Result: 42入力が "parse"、"xyz"、"unused" の場合、プログラムは次のように出力する必要があります。
Operation: parse
Input: xyz
FormatException caught: Invalid number format
Please provide a valid integer入力が "divide"、"10"、"2" の場合、プログラムは次のように出力する必要があります。
Operation: divide
Values: 10, 2
Division successful!
Result: 5入力が "divide"、"10"、"abc" の場合、プログラムは次のように出力する必要があります。
Operation: divide
Values: 10, abc
FormatException caught: Invalid number format
Cannot perform division with invalid numbers入力が "access"、"hello"、"1" の場合、プログラムは次のように出力する必要があります。
Operation: access
List: [hello]
Index: 1
RangeError caught: Index out of range
Valid indices are 0 to 0プログラムでは、onキーワードを使用した個別の try-catch ブロックを使用して、FormatException と RangeError を具体的にキャッチする必要があります。各例外タイプには、何が問題だったかを明確に説明する、独自に調整されたエラーメッセージが必要です。"access" 操作では、最初の入力値のみを含むリストを作成し、2番目の入力値で指定されたインデックスへのアクセスを試みてください。
チートシート
一般的な catch ブロックを使用する代わりに、on キーワードを使用して特定の例外タイプをキャッチします。
try {
int number = int.parse("abc");
} on FormatException {
print("Please enter a valid number");
}複数の on ブロックを組み合わせて、異なる例外タイプを適切なレスポンスで処理できます。
try {
// 異なる例外をスローする可能性のあるコード
} on FormatException {
print("Invalid format error");
} on RangeError {
print("Index out of range error");
}このアプローチにより、特定の例外タイプごとにカスタマイズされたレスポンスが可能になり、エラーハンドリングをより詳細に制御できます。
自分で試してみよう
import 'dart:io';
void main() {
// 入力を読み込む
String? operation = stdin.readLineSync();
String? firstValue = stdin.readLineSync();
String? secondValue = stdin.readLineSync();
// 操作情報を表示
print('Operation: $operation');
// TODO: 以下にコードを記述してください
// 特定の例外を処理するために 'on' キーワードを使用した try-catch ブロックを使用してください
// parse および divide 操作の FormatException を処理してください
// access 操作の RangeError を処理してください
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
1リスト操作の応用
リストのプロパティ: first と lastリストの状態: isEmpty と isNotEmptyリストの反転リストへの追加: insertリストの削除: removeWhereリスト内の検索: indexOfリストのソートリストのシャッフルまとめ - リストオーガナイザー