直接スローする代わりに、 ThrowHelperメソッドを使用するのが適切なのはどのような場合ですか?
void MyMethod() {
...
//throw new ArgumentNullException("paramName");
ThrowArgumentNullException("paramName");
...
}
void ThrowArgumentNullException(string paramName) {
throw new ArgumentNullException(paramName);
}
直接スローする代わりに、 ThrowHelperメソッド (例外をスローすることのみを目的としたメソッド)を呼び出すと、より小さなバイトコードが生成されるはずであると読みました。
これと、明らかなカプセル化 (間接的な別のレイヤー) は、少なくともいくつかのシナリオでは、直接スローしない十分な理由になる可能性があります。
とにかく、IMO の欠点も重要ではありません。
- (例外的な) 制御フローの一部が隠されています
- 例外は、より不可解なスタックトレースを持つことになります
- コンパイラ (2.0) は、ThrowHelper呼び出しがメソッドからの終了ポイントであることを認識しないため、何らかのコード アラウンドが必要です。
私の限られた経験では、全体的な設計が悪化することがよくあります。
int MyMethod(int i) {
switch (i) {
case 1:
return 1;
default:
ThrowMyException();
}
return 0; // Unreachable (but needed) code
}
これは部分的に個人的な好みの問題かもしれません。とにかく、この問題に関するあなたの個人的なガイドラインは何ですか? メソッド パラメーターの検証 ( ThrowArgumentNullException(paramName)など) などの一般的なタスクすべてに、 ThrowHelpersを使用することをお勧めしますか? この問題について明らかな何かが欠けていますか?
ところで、この問題と検証の問題を混同しないようにしています。たとえば、次のような方法です。
ThrowIfNameIsNullOrEmpty(name);