質問
私はフォローしています 速く失敗します 主要。コンストラクターパラメーターの引数を確認するために、アサーションクラスを配置することが良い習慣かどうか疑問に思っています。
例えば:
public static class Assertions
{
public static void ParamterIsNotNull(object subject, string paramName = "")
{
if (subject == null) throw new ArgumentNullException(paramName, "Paramter cannot be null");
}
}
そして使用中:
public class Test
{
public Test(object obj)
{
Assertions.ParamterIsNotNull(obj, "obj");
}
}
例外を別のクラスに投げることをオフロードすることは良い習慣ですか、それともコンストラクターに例外を直接スローする方が良いでしょうか?
解決
私が読んだことから(記事の最後に)マーティンは、両方のことをするのは良いことだと言います - 高速失敗、意味のある例外と「遅い失敗」を提供する - ユーザーに連絡先のサポートを言って続行するための侵害性を与えます例外に関係なく、成功する可能性のあるタスク。
この場合、バッチシステムの例は非常に優れていました - バッチの1つのアイテムはファイリングかもしれませんが、ユーザーはおそらく残りのものを使用することを望むでしょう。そのため、グローバルハンドラー(グローバルハンドラー)がキャッチする例外を投げます。ハンドラーは、次のアイテムを継続し、エラーを集約してユーザーに表示し、DEVチームに通知を送信できるようにします)。
この方法は両方とも完了します - ほとんどのユーザー作業が完了し、高速失敗の原則も同様に発射されます。
したがって、それはあなたの具体的なケースに依存します - おそらくあなたのクラスが他の操作に参加している場合、より多くのグローバルクラス(またはそれを使用する発信者クラス)が存在するでしょう。
一方、クラスは、障害の場合に呼び出しクラスが他の作業を行うことができるかどうかを判断できないはずなので、コンストラクターに例外をスローする必要があります。これは私が思うことです - はい:)。したがって、クラスがバッチのアイテムを表している場合、発信者はおそらく例外をキャッチして続行します。それが何らかのエントリポイントクラスの場合 - おそらく例外を優雅に処理する(またはまったく投げない)、ユーザーにエラーメッセージを表示し、開発チームに詳細(ログ)を提供して、簡単に伝えることができるようにすることをお勧めします。問題がどこにあったのか。