2016-08-03 8 views
2

私はこの記事を参照しています:アサーションチェックが失敗した場合、それはAssertionErrorをスローし、変数の有効性を確認することができます:What does the Java assert keyword do, and when should it be used?アサーションは、変数が本番環境で有効になっていない場合、どのように変数の正当性をチェックするのですか?

私の理解では、ということです。このチェックは、通常は本番環境ではオフになっています。


質問1:なぜ生産に我々は、パラメータの妥当性をチェックする必要はありませんか?つまり、ユーザーは無効なパラメータを渡して意図的にプログラムを中断することができます。

質問2:アサーションは通常プロダクションではオフになるため、アサーションに加えてチェックとスローの例外を記述する必要がありますか?

+1

にならない何の正当な理由を持っていないはずですが、リレーのもののために主張しなければならないあなたは答えに最初のコメントを読みましたか? *実際には、Oracleはパブリック・メソッドのパラメータをチェックするために 'assert'を使用しないように指示します。プログラムを強制終了する代わりに 'Exception'を投げるべきです。* – Andreas

答えて

1

アサーションは、コードが想定している状態を検証するために使用されます。

言い換えれば、アサーションが失敗した場合、アプリの世界は崩壊しています(または単にバグかもしれません)。

これは、処理できるエラー(ユーザーの入力が間違っている)とは逆です。

たとえば、ユーザーに電話番号を尋ねたとします。 は、電話番号の形式が間違っている場合はをアサートしないでください。代わりにチェックし、それに応じて応答する必要があります(エラーコードまたはエラーメッセージを表示する)。

一方、電話番号をデータベースに格納しているとします。あなたのアプリがロードされると、データベースに接続し、そこから接続がライブであると仮定して、書き込みと読み取りを行っています。 dbに電話番号を格納する方法を記述している場合、データベースの接続をチェックするコードを書くべきではなく、接続が有効であることを確認するためにassertを追加することができます。 このように開発モードでは、(何らかの理由で)assert時にdbが利用できなかった状況に遭遇した場合、読みやすいスタックトレースが得られます。親指の

役割:あなたが正しいと

-1

回答1:「コード内の不変式の正当性を検証する」ためにアサーションが使用されます。ユーザー入力は不変式ではありません。

回答2:はい、おそらく不変量をチェックしていないので、おそらくアサートを削除する必要があります。

2

ユーザーがおそらくというアプリケーションを使用すると思われることが重要です。内部アサーションが成立していない場合は、にアプリケーションを登録したくありません。

つまり、テストとプロダクションはさまざまな点で異なります。それらの1つはエラーの処理です。テスト担当者は迅速な失敗を望むかもしれません。できるだけ正確なエラー情報と一緒に。エンドユーザは、何をしていても続行したいと考えています。そしてもしあれば。彼はあなたに報告できるエラーコードをいくつか求めています。

したがって、コード内に専用のエラー処理が必要です。あるメソッドが "悪い"入力で失敗するかどうか。対応する例外がスローされるはずです。そして、他のいくつかのコンポーネントは、その例外をキャッチしてそこから何をすべきかを決定する必要があります。言い換えれば、たぶんあなたはアサーションをまったく使用したくないということでしょう。エンドユーザーが使用する製品とまったく同じ製品をテストする場合。したがって、エラー処理の2つの異なる方法を持つことは有益なパターンではありません。

関連する問題