投げることSystem.Exception
がとても悪いと考えられるなら、そもそもなぜException
行わabstract
れなかったのですか?
そうすれば、以下を呼び出すことはできません。
throw new Exception("Error occurred.");
これにより、派生した例外を使用して、発生したエラーに関する詳細を提供することができます。
たとえば、ライブラリのカスタム例外階層を提供する場合、通常、例外の抽象基本クラスを宣言します。
public abstract class CustomExceptionBase : Exception
{
/* some stuff here */
}
そして、より具体的な目的を持ついくつかの派生した例外:
public class DerivedCustomException : CustomExceptionBase
{
/* some more specific stuff here */
}
次に、ライブラリメソッドを呼び出すときに、この汎用try / catchブロックを使用して、ライブラリからのエラーを直接キャッチできます。
try
{
/* library calls here */
}
catch (CustomExceptionBase ex)
{
/* exception handling */
}
これは良い習慣ですか?
Exception
抽象化された場合、良いでしょうか?
編集:ここで私のポイントは、例外クラスがマークされabstract
ていても、キャッチオールブロックでそれをキャッチできるということです。抽象化することは、プログラマが「スーパーワイド」例外をスローすることを禁止する方法にすぎません。通常、例外を自発的にスローする場合、例外のタイプとその理由を知る必要があります。したがって、より具体的な例外タイプをスローするように強制します。