130

ほとんどの場合、コード内の条件をチェックするために例外を使用しますが、いつアサーションを使用するのが適切なのだろうか?

例えば、

Group group=null;
try{
    group = service().getGroup("abc");
}catch(Exception e){
    //I dont log error because I know whenever error occur mean group not found
}

if(group !=null)
{
    //do something
}

アサーションがここにどのように適合するかを示していただけますか? アサーションを使用する必要がありますか?

実稼働コードでアサーションを使用することはなく、単体テストでのみアサーションが表示されるようです。ほとんどの場合、例外を使用して上記のようなチェックを行うことができることは知っていますが、「専門的に」行うための適切な方法を知りたいです。

4

11 に答える 11

179

私の頭から(リストは不完全で、長すぎてコメントに収まらない可能性があります)、私は言うでしょう:

  • public または protected メソッドおよびコンストラクターに渡されたパラメーターをチェックするときに例外を使用する
  • ユーザーと対話するとき、またはクライアント コードが例外的な状況から回復することを期待するときに、例外を使用します。
  • 例外を使用して、発生する可能性のある問題に対処する
  • プライベート/内部コードの事前条件、事後条件、および不変条件をチェックするときにアサーションを使用する
  • アサーションを使用して、自分自身または開発者チームにフィードバックを提供する
  • 発生する可能性が非常に低いことを確認する場合は、アサーションを使用します。それ以外の場合は、アプリケーションに重大な欠陥があることを意味します
  • 主張を使用して、(おそらく) 真実であるとわかっていることを述べる

つまり、例外はアプリケーションの堅牢性に対処し、アサーションはその正確性に対処します。

アサーションは安価に記述できるように設計されており、ほとんどどこでも使用できます。私は次の経験則を使用しています。正しく動作しないプログラムをデバッグするときは、経験に基づいて、より明白な失敗の可能性を確実に確認します。次に、起こり得ない問題をチェックします。これはまさに、アサーションが大いに役立ち、時間を節約するときです。

于 2009-12-24T10:03:20.367 に答える
88

アサーションは、発生してはならないことをチェックするために使用する必要がありますが、例外は発生する可能性があることをチェックするために使用する必要があります。

たとえば、関数が 0 で除算される場合は例外を使用する必要がありますが、アサーションを使用してハードドライブが突然消えたことを確認できます。

アサーションはプログラムの実行を停止しますが、例外はプログラムの実行を継続します。

if(group != null)はアサーションではなく、単なる条件であることに注意してください。

于 2009-12-24T10:05:13.707 に答える
28

アサーションは、パラメーターを使用して実行時に無効にすることができ、デフォルトでは無効になっているため、デバッグ目的以外では当てにしないでください。

また、assert に関する Oracle の記事を読んで、assertを使用する、または使用しない場合の詳細を確認してください。

于 2009-12-24T10:04:49.137 に答える
16

原則として:

  • 誰かがアサーションをオフにしてもまったく問題にならない内部整合性チェックにアサーションを使用します。(このjavaコマンドは、デフォルトですべてのアサーションをオフにすることに注意してください。)
  • オフにすべきではないあらゆる種類のチェックには、定期的なテストを使用してください。これには、バグによる潜在的な損害を防ぐための防御チェック、および検証データ/リクエスト/ユーザーまたは外部サービスによって提供されるものすべてが含まれます。

あなたの質問からの次のコードはスタイルが悪く潜在的にバグがあります

try {
    group = service().getGroup("abc");
} catch (Exception e) {
    //i dont log error because i know whenever error occur mean group not found
}

問題は、例外がグループが見つからなかったことを意味することを知らないことです。呼び出しが例外をスローしたか、service()呼び出しが返さnullれたためにNullPointerException.

「予期される」例外をキャッチするときは、予期している例外のみをキャッチする必要があります。キャッチすることjava.lang.Exceptionで (特にログに記録しないことで)、問題の診断/デバッグが難しくなり、アプリがより多くの損害を与える可能性があります。

于 2009-12-24T14:50:54.770 に答える
4

Microsoft での推奨事項は、公開するすべての API で例外をスローし、内部のコードについて行うあらゆる種類の仮定でアサートを使用することでした。少し大まかな定義ですが、線引きは各開発者次第だと思います。

例外の使用に関しては、その名前が示すように、その使用法は例外的でなければならないため、上記のコードでは、サービスが存在しない場合はgetGroup呼び出しが返されます。null例外は、ネットワーク リンクがダウンした場合などにのみ発生します。

結論としては、アサートと例外の境界を定義することは、各アプリケーションの開発チームに少し任せられているということだと思います。

于 2009-12-24T10:06:30.447 に答える
3

このドキュメントhttp://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#design-faq-generalによると、「assertステートメントは、非公開の前提条件、事後条件、およびクラス不変条件に適しています。チェック。パブリック前提条件チェックは、特にIllegalArgumentExceptionやIllegalStateExceptionなどの文書化された例外をもたらすメソッド内のチェックによって実行する必要があります。」

前提条件、事後条件、およびクラス不変条件について詳しく知りたい場合は、次のドキュメントを確認してください:http: //docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#usage-conditions。また、アサーションの使用例も含まれています。

于 2012-10-22T21:31:03.013 に答える
1

この単純な違いを念頭に置いて使用することができます。例外は、チェック済みおよび未チェックのエラーと呼ばれる予期されるエラーと予期しないエラーをチェックするために使用されますが、アサーションは、主に実行時に前提条件が検証されているかどうかを確認するためのデバッグ目的で使用されます。

于 2012-06-11T09:37:26.817 に答える
1

null のテストは、問題を引き起こす null のみをキャッチしますが、try/catch はエラーをキャッチます。

一般に、try/catch の方が安全ですが、少し遅くなります。発生する可能性のあるすべての種類のエラーをキャッチするように注意する必要があります。したがって、try/catch を使用するといいでしょう。ある日、getGroup コードが変更される可能性があり、より大きなネットが必要になるかもしれません。

于 2009-12-24T10:04:13.070 に答える
1

残念ながら、アサートは無効にすることができます。本番環境では、予期せぬ事態を追跡する際に得られるあらゆる支援が必要になるため、assert は資格を失います。

于 2009-12-24T14:25:42.777 に答える
1

私はあなたの質問に少し混乱していることを告白します。アサーション条件が満たされない場合、例外がスローされます。紛らわしいことに、これはAssertionErrorと呼ばれます。(たとえば)非常によく似た状況でスローされるIllegalArgumentExceptionのように、チェックされていないことに注意してください。

したがって、Javaでアサーションを使用する

  1. 条件/スローブロックを書くためのより簡潔な手段です
  2. JVM パラメータを介してこれらのチェックをオン/オフにすることができます。通常、実行時のパフォーマンスに影響を与えるか、同様のペナルティがない限り、これらのチェックは常にオンのままにします。
于 2009-12-24T10:41:36.677 に答える
0

次のリンクにある Sun のドキュメントのセクション 6.1.2 (Assertions vs. other error code) を参照してください。

http://www.oracle.com/technetwork/articles/javase/javapch06.pdf

このドキュメントは、アサーションをいつ使用するかについて、私が見た中で最高のアドバイスを提供します。ドキュメントからの引用:

「経験則として、忘れたい例外的なケースにはアサーションを使用する必要があります。アサーションは、必要のない条件や状態に対処し、忘れるための最も迅速な方法です。対処する。"

于 2012-07-12T04:35:44.683 に答える