2020/11/14 A tour of the Dart language>>assert,Exceptionsの訳

 

 

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.
}

例外についてはこちらもご覧ください。

 

 

参考

https://dart.dev/guides/language/language-tour#assert

https://dart.dev/guides/language/language-tour#exceptions

コメントを残す

メールアドレスが公開されることはありません。