assert
例外を処理する方法ではなく、例外を検出する方法です。(したがって、あなたが見つけた説明は、私には少し的外れに思えます。)それは基本的に次のように言う方法です:
これは真実であるべきです。そうでない場合は、エラーをスローします。
そのエラーをどのように処理するかは、まったく別の問題です。それを検出した関数で処理する場合もあれば、それを呼び出した関数で処理する場合もあれば、アプリケーション レベルのスタックの最上部で処理する場合もあります。
例外 (使用されているプログラミング言語の構成要素) をキャッチすることと、意味のある例外処理 (使用されている言語に依存しない論理構成要素)の間には大きな違いがあることに注意してください。実際に対処できる例外のみをキャッチします。それ以外の場合は、それらに対して何かを実行できる他のコードにスタックをバブルアップさせます。(しかし、assert
はエラーをキャッチしないので、エラーをスローします。使用しようとしている場所で正確に使用する必要があります...エラーを検出できるポイント、たとえそれを処理できない場合でも。)
を使用しようとしているのを見ると、assert
近いようです。これは実際には正しい使い方ではありません:
assert (x > 0) ? "assertion failed" : "assertion passed";
assert
単なるブール値であるかのように扱っています。そして、? :
演算子を使用して、そのブール値をキーオフして...まあ...実際には何もしません。"assertion failed"
文字列 (または"assertion passed"
) を、その文字列で何もしないコード行に返すだけです。
近いですが、完全ではありません。
それassert
自体は、状態をチェックするだけではありません。エラーをスローするか、コード パスの続行を許可することで、条件に応答しています。演算子を使用しますが、:
演算子の一部としては使用しません? :
。だから私はあなたがやろうとしていることはこれだと思います:
assert (x > 0) : "assertion failed";
これは基本的に次のように言っています。
x は常に 0 より大きい必要があります。そうでない場合は、何かが非常に間違っています。何もしないでエラーを発生させます。
これAssertionError
により、メッセージとともに が発生します"assertion failed"
(もちろん、デバッグに役立つように、検査されている値に関する有用な実行時情報を含む、より意味のある有用なメッセージに置き換えたいと思うでしょう)。
次に、他の場所でそれを処理しAssertionError
、何らかの方法で応答します。
の使用は、次のassert
ようなものと非常によく似ていますが、より短く、その意図に対してもう少し表現力豊かです。
if (x <= 0) throw new CustomException("assertion failed");
ご覧のとおり、assert
は次の点で少しすっきりしています。
- 特定のキーワードを使用して、仮定の検証のみを目的として条件をチェックしているという事実に注意を喚起します。がそうしている
if
可能性もあれば、他の理由で新しいコード パスを分岐している可能性もあります。
- 他のエラーとは別にフィルタリングできる特定のエラーをスローします。
CustomException
同じことを行うために a を使用することに注意してください。ただし、AssertionError
より一般的に知られている/期待されている.
- 少ないコードを使用します。
- 逆条件または偽条件とは対照的に、真の条件を示します。ほとんどの場合、真の条件の方が読みやすく、コードの意図をより明確に表しています。
- 慣例に従い、より慣用的です。
- コードを残りのコードとは別に、特定の目的のためのものとして設定し、アサーションはアサーションのみであるべきであることを他の開発者に示します。(したがって、他の開発者は、アサーションに副作用を追加する可能性があるため、2 番目のコード パスとして変更しないでください。)
- 実行中のアプリケーションに対してグローバルにオンまたはオフを非常に簡単に切り替えることができます。Java では、任意のランタイム コンテキストでアサーションのチェックを有効または無効にすることができます。これは、分野横断的な関心事としてアサーションをグローバルに管理するのに非常に便利です。