Contents
Assert
ブール条件がfalseの場合、通常の実行を中断するために、assertステートメントを使用します。assertステートメントは開発段階で使用します。
// Make sure the variable has a non-null value. assert(text != null); // Make sure the value is less than 100. assert(number < 100); // Make sure this is an https URL. assert(urlString.startsWith('https'));
メッセージをアサーションに添付するには、assertメソッドの2番目の引数として文字列を追加します。(オプションで末尾にコンマを付けます)。
assert(urlString.startsWith('https'), 'URL ($urlString) should start with "https".');
assertメソッドの一番目の引数には、任意の、bool値となる(bool値と評価される)式を渡せます。
一番目の引数の値がtrueなら、assertメソッドは成功し、その後の処理が実行されます。
一番目の引数の値がfalseなら、assertメソッドは失敗し、例外がスローされます。(an AssertionError)
アサーションはいつ有効に機能しますか?これは、使用しているツールとフレームワークによって異なります。
プロダクションコードでは、アサーションは無視され、assertメソッドへ渡された引数は評価されません。
Exceptions
あなたのDartコードは例外(exception)をスローし、例外をキャッチすることができます。例外は何か予期しないことが発生したことを示すエラーです。
例外がキャッチされない場合、例外を発生させたisolateは中断され、isolateとそのプログラムは終了します。
Javaとは対照的に、Dartの例外はすべてチェックされていない例外です。メソッドは、スローする可能性のある例外を宣言しません。また、例外をキャッチする必要はありません。
Dartは、例外 タイプとエラータイプ、および多数の事前定義されたサブタイプを提供します。
もちろん、独自の例外を定義することもできます。ただし、Dartプログラムは、ExceptionオブジェクトとErrorオブジェクトだけでなく、null以外のオブジェクトを例外としてスローできます。
Throw
例外のスロー(throw)のサンプルです。あるいは例外をあげる(raise)サンプルです。
throw FormatException('Expected at least 1 section');
例外以外の任意のオブジェクトをスローすることもできます。
throw 'Out of llamas!';
例外のスローは式であるため、=>ステートメント、および式を許可するその他の場所で例外をスローできます。
void distanceTo (Point other )=> throw UnimplementedError ();
Catch
例外をキャッチまたはキャプチャすると、例外の伝播が停止します(例外を再スローしない限り)。例外をキャッチすると、それを処理する機会が与えられます。
try { breedMoreLlamas(); } on OutOfLlamasException { buyMoreLlamas(); }
複数のタイプの例外をスローする可能性のあるコードを処理するために、複数のcatch句を指定できます。
スローされたオブジェクトのタイプに一致する最初のcatch句は、例外を処理します。catch句でタイプが指定されていない場合、その句は任意のタイプのスローされたオブジェクトを処理できます。
try { breedMoreLlamas(); } on OutOfLlamasException { // 特定の例外を捕捉するのでonを使っている。 // 例外オブジェクトは使わないのでcatchは使っていない。 buyMoreLlamas(); } on Exception catch (e) { // 全ての例外を捕捉。 print('Unknown exception: $e'); } catch (e) { // 全てのスローされたオブジェクトを捕捉。 print('Something really unknown: $e'); }
上記のコードが示すように、on、あるいはcatch、あるいはonとcatchの両方を使用することができます。例外の型を特定する時はonを使う必要があります。例外処理する時に例外オブジェクトを受け取る必要があるときはcatch節を使って受け取ります。
catch()節の引数には一つ、あるいは二つの引数を指定することができます。一つ目の引数はスローされた例外オブジェクトです。二つ目の引数はスタックトレースです。
try {
// ···
} on Exception catch (e) {
print('Exception details:\n $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
}
例外を部分的に処理し、伝播を許可するには、rethrow
キーワードを使用します。
void misbehave() {
try {
dynamic foo = true;
print(foo++); // Runtime error
} catch (e) {
print('misbehave() partially handled ${e.runtimeType}.');
rethrow; // Allow callers to see the exception.
}
}
void main() {
try {
misbehave();
} catch (e) {
print('main() finished handling ${e.runtimeType}.');
}
}
Finally
例外がスローされたかどうかに関係なく、一部のコードが確実に実行されるようにするには、finally
句を使用します。例外に一致するcatch句がない場合、例外はfinally
句の実行後に伝播されます。
try { breedMoreLlamas(); } finally { // Always clean up, even if an exception is thrown. cleanLlamaStalls(); }
このfinally
句は、一致するcatch
句の後に実行されます。
try { breedMoreLlamas(); } catch (e) { print('Error: $e'); // Handle the exception first. } finally { cleanLlamaStalls(); // Then clean up. }
例外についてはこちらもご覧ください。
参考