4

理にかなっている場合は、独自の例外を定義するのではなく、組み込みの例外を常に使用する必要があります。つまり、次のようになります。

  • IllegalArgumentException- メソッドに無効なパラメーターが渡された場合にスローされます。つまり、null は許可されていません。
  • IllegalStateException- メソッドが許可されていないときに呼び出されたときにスローされます (つまりsetup()、最初に呼び出す必要があります。

ユーザーが操作権限のないリソースの読み取りまたは書き込みを試みたために例外をスローする場合、スローするのに最適な例外の種類 (存在する場合) は何ですか? またはを使用することをお勧めしますSecurityExceptionAccessControlException、またはそれは無意味に聞こえますか。

4

5 に答える 5

6

私の意見では、どちらもありません。各例外クラスは目的を果たします。この場合、 SecurityManager(JREの一部)SecurityExceptionによってスローされる例外のクラスであり、のサブタイプです。AccessControlExceptionSecurityException

SecurityException本当の原因が(によって強制されるアクセス許可ではなく)アプリケーション定義のアクセス許可が付与されなかった場合に、をスローすることは正しくないと思います(名前はきれいですがSecurityManager)。

例外は、それらの処理方法を知ることができると期待されるコードによってキャッチされることを意図していることを考慮する必要があります。一部の関数が例外を「修正」する方法を知らない場合は、例外がスタックをバブルアップできるようにする必要があります。処理するコードSecurityExceptionは、アプリケーションによって発生した例外を処理する方法を確実に知りません。

于 2013-02-27T00:23:55.410 に答える
5

http://docs.oracle.com/javase/7/docs/api/java/security/AccessControlException.htmlから:

この例外はAccessControllerによってスローされ、要求されたアクセス(ファイルシステムやネットワークなどの重要なシステムリソースへの)が拒否されたことを示します。

アクセスを拒否する理由はさまざまです。たとえば、要求されたアクセス許可のタイプが正しくない、無効な値が含まれている、またはセキュリティポリシーに従って許可されていないアクセスを要求している可能性があります。このような情報は、例外がスローされたときに可能な限り提供する必要があります。

あなたが説明しているシナリオにかなり近いように聞こえます。私は一緒に行きAccessControlExceptionます。

Permissionオブジェクトを受け取るコンストラクターさえあることに注意してください。

于 2013-02-27T00:23:51.733 に答える
2

組み込みの例外を常に使用する必要があるというのは事実ではありません。MyProjectPermissionExceptionAPIを提供している場合は、プロジェクトが「MyProject」の場合など、独自のカスタム定義の例外をスローする方が適切です。IllegalArgumentExceptionもちろん、ユーザーが露骨に悪い議論を渡した場合でも、ビルトインをスローするのが最善である場合が多くあります。

SecurityException発信者に役立つ場合は、たとえば、カスタム定義の例外に実際の原因を配置することを検討することもできます。

catch(SecurityException e)
{
    throw new MyProjectPermissionException("Permission denied", e);
}
于 2013-02-27T00:23:49.913 に答える
0

このユースケースでは、独自の、場合によってはチェック済みの例外を実際に実装することをお勧めします。私の知る限り、コアAPIには、あなたが説明するものに対して十分に一般化されたものはありません。

ありますがAccessDeniedException、それは拡張IOExceptionされているため、チェックされた例外であり、ファイルアクセスに厳密に関連しています。

于 2013-02-27T00:22:33.817 に答える
0

チェックされた例外については、新しい例外タイプを使用したほうがよいでしょう。そうしないと、誰かが をキャッチした場合SecurityException、それが何を意味するのかが不明確になります。

于 2013-02-27T00:22:53.690 に答える