Javaの例外の例外サフィックス


19

例外クラスで例外の接尾辞を指定すると、コードの匂いがします(冗長な情報-名前の残りの部分はエラー状態を意味し、例外から継承されます)。しかし、それは誰もがそれをしているようで、良い習慣のようです。

私はこれが良い習慣である理由を理解したいと思っています。

私はすでに例外がクラス名に接尾辞例外を持っているのはなぜかという質問を見てきました

質問はPHPに対するものであり、応答はおそらくJavaに対して有効です。他の引数はありますか、それとも明示的に区別するのと同じくらい簡単ですか?

前の質問の例を取り上げると、FileNoFound例外ではない名前のクラスが実際にjavaにあるでしょうか?可能であれば、接尾辞を付ける必要がありExceptionますか?

の日食の簡単な階層を見るとException、確かに、それらの大部分は例外の接尾辞を持っていますが、いくつかの例外があります。javassist例えば-接尾辞なしでいくつかの例外を持っていると思われるライブラリの一例であるBadByteCodeBadHttpRequestなど

BouncyCastle のような例外を持つ別のライブラリです CompileError

私はこの問題に関する情報がほとんどないので、少しグーグルで調べました。


2
「すべての例外にはException接尾辞を付けるべきですか、それとも例外的な例外に対して例外を作成すべきですか?」;)
tdammers

2
実際にはエラーはException(OutOfMemoryErrorを参照)のようなものですが、回復が困難なものを対象としています(したがって、ほとんど対処することはありません)
ラチェットフリーク

1
また、一般的なルールとして、「クラスは名詞であり、メソッドは動詞(アクション)でなければなりません」と聞きました。FileNotFound ArrayIndexOutOfBoundsそしてOutOfMemory、より多くの観察/説明ですが、名詞に適用されExceptionます。
MikeTheLiar

回答:


27

Landeiの答えは良いものですが、文法的な答えもあります。 クラス名は名詞でなければなりません。「OutOfMemory」とは何ですか?「FileNotFound」とは何ですか?「例外」を名詞と考える場合、記述子はそれを指定する形容詞です。それはただのではありませんException、それはです、FileNotFoundException。あなたはOutOfMemory「青」を買うために店に行くよりも多くをキャッチする必要はないはずです。

これは、コードを文として読んだ場合にも表示されます: " Trydoing ...、and catch OutOfMemory Exceptions"


1
「クラスは通常、現実世界で何かを表しているため、名詞を使用してみてください」という記事を引用します。しかし、例外はこの場合に該当しますか?私にとって、それらはエラーメッセージを表すプログラミングアーティファクトのようなものです。「OutOfMemory例外が発生します」は「例外が発生します」よりも読みやすいOutOfMemoryExceptionですね。
greg0ire

1
@ greg0ire-「あなたはを取得しOutOfMemoryExceptionます」として試してください。ただし、PIN番号とATMマシンもあるため、OOME例外はそれほど珍しいことはありません。
ボブソン

ここであなたが述べているポイントは本当に最高のものだと思います(少なくともPHPでは、名前の競合については名前空間のおかげでもう成り立ちません)。私はこれについてもっと言いたいことがあり、すぐに答えを投稿します。
greg0ire

できた!どう思いますか?
greg0ire

@Bobson 名詞の王国を読むことをお勧めします。すべてが名詞になる必要はありません。なぜ「あなたが得るでしょうOutOfMemoryException、それは単に」あなたがすることができたときに、「あるメモリ不足」?私たちは使用しませんClass(接尾辞をDogClassCatClassXmlReaderClass...、)。
マチューナポリ

6

例外(およびエラー、および理論的にはその他Throwable)は、インターフェイスや列挙型(通常は接尾辞として使用されない)などとは異なると思います:通常、それらは非常に明確で限定された目的を持ち、特殊な言語構造(trycatchthrowthrows)や特殊なルールに従う(例えば未チェックの例外なしジェネリック)対確認。ある意味では、これらはたまたま例外として使用されるクラスではなく、クラスによって実装される例外メカニズムです。

したがって、例外を処理し、それをそのように認識しない場合、通常、何かが非常に間違っています(これも列挙型やインターフェイスのようなものには当てはまりません)。したがって、これらの「通常の」クラスとの違いは、視覚的な手がかりを必要とするほど大きいと思います。


1
私には矛盾しているように聞こえます。例外が特別で、特別な方法で使用され、明らかに認識できる場合、なぜ視覚的な手がかりが必要なのですか?
マイケルボルグ

@MichaelBorgwardt-彼は、それらが特別で特別な方法で使用されているため、明らかに認識できる視覚的な手がかりを持つべきだと言っていると思います。そうは言っても、Java から継承されていないものを投げることができるかどうかはわかりませんException。C#ではできません。できない場合は、「例外に対処し、それをそのように認識します[しない]」というシナリオを考えることはできません。
ボブソン

ThrowableJavaでnon-をスローすることもできません。ただし、try-- catchsettings だけでなく例外を処理することもできます。たとえば、複雑なオブジェクトに対して何らかの検証を行う場合(最初の問題だけでなく、関連するすべての問題を知りたい場合)に例外を収集できます。このような場合、リストにあるものを再スローできることを知っておく必要がValidationIssueありValidationExceptionます。つまり、の代わりにそれらを呼び出すのは悪いでしょう。
ランデイ

0

しかし、誰もがそれをしているようで、それは良い習慣のようです。

はい、誰もが実際にそれを行うので、それは練習ですが、それはまだ良いですか?いくつかの人々はそれを疑問視しています:

  • http://mnapoli.fr/approaching-coding-style-rationally/(例外サフィックス§コンテキスト:php)
  • リンクされたビデオ、https://vimeo.com/album/2661665/video/74316116(53:00にスキップ、コンテキスト:php)は、記事を刺激し、例外を使用するたびにキーワードがあることを強調しています既に例外であることを示しています
  • http://verraes.net/2013/10/verbs-in-class-names/は、@ Bobsonの答えのステートメントが絶対ではない可能性があることを示し、アプリケーションまたはインフラストラクチャレベルの例外です。この長いサフィックスが使用する文字を保存して、より正確で意味のあるものを表現することもあります。この点は、文化がビジネスルール違反の例外を使用する言語を使用している場合にのみ意味があります。
  • SOのリンク我々は、ありませんあなたは名前の競合について作るポイントを提供しますが、今、私たちは、名前空間を持っていますか?

これはjavaの質問であり、phpの質問ではありません。イディオムは言語によって異なります。とはいえ、3番目のリンクからのこの引用には強く反対します。 「例外はイベントに類似している可能性があります。有効です。」 PHPはこれについて異なるかもしれませんが、私の考えでは、例外は例外的であるはずです。予期された方法でビジネスルールに違反した場合、通常のロジックで処理する必要があります。通常の動作の例外でありません。
ボブソン

:のpythonについては、このスレッドを参照してください。あなたは右のそれは言語ごとに言語毎に変化することであってもよいgossamer-threads.com/lists/python/python/796627を。phpとpythonは明らかにパフォーマンス重視ではありません。そのため、javaとこの違いがあるのでしょう(パフォーマンス重視ですよね?)。ビジネスルール違反を適切に処理するために適切なレベルになる前に、コールスタックで複数のレイヤーを横断する場合は、例外が最高のIMOです。また、戻り型の一貫性が向上します(falseまたはtrueではなく、常に同じ型を返します)。この回答をアカウントに編集します
greg0ire
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.