2011-04-13 10 views
0

私は.SVCファイルでのtry..catchブロックを避けるために、引数を確認する(?)

public SomeDTO Method1(byte[] bitmapAsByteArr, DTO1 dto1, DTO2 dto2) 
    { 
     if(bitmapAsByteArr!= null && bitmapAsByteArr.Length > 0 && dto1!= null && dto2 != null) 
     { 
      return new SomeDTO(bitmapAsByteArr,dto1,dto2,1,2,3,4); 
     } 
     else 
     { 
      throw new ArgumentNullException(); 
     } 
    } 

を、この方法を書いた私は、この方法は、彼らが試みで、このメソッドの本体を作る方が良い場合さまよいました。..キャッチブロック。 この場合、何が良いですか?

+2

を必要とされているものは何でもあなたは例外を_return_べきではありません、あなたは**スロー**それらべきにスローを追加または変更するのは簡単です。 –

+0

はい...私の間違い.. :) – Yanshof

答えて

1

ここで使用しているパターンは、投げるのではなく例外を返すという点で間違っています。私はそれが問題のエラーだと思います。そうでなければ、あなたのSomeDTOオブジェクトは何とかArgumentNullExceptionクラスに接続しなければならないでしょう。それは間違っています。あなたは何ができるか

は次のとおりです。
- 私たちは有効性のためにすべての引数を確認し、

if (are_all_arguments_ok) 
{ 
    //procedure code, possibly hundreds of lines 
} 
else 
{ 
    throw new SingleExceptionForAnyParameterIssues(); 
} 

仕事をあなたの解決策、 -

try 
{ 
    //procedure code, possibly hundreds of lines 
} 
catch 
{ 
    //not really sure what we caught here 
    //could be a parameter problem, could be a code problem 
    throw new SingleExceptionForAnyParameterIssues(); 
} 
のような埋め込み try..catchのコード、

- メソッドの先頭にパラメータをチェック

if (param1_is_null) 
{ 
    throw new ArgumentNullException("param1"); 
} 
if (param1_is_invalid) 
{ 
    throw new ArgumentException("bad, bad param1","param1"); 
} 
// other parameters are checked here 

//procedure code, possibly hundreds of lines 

ので、私は(obviuosly)第三の方法をprefere:それは、よりきめの細かいチェックの代わり可能実際の作業

  • を行い明確なパラメータ有効性をチェックするコードの分離、およびコードを与え

    • これはメソッドの冒頭にあり、地域に隠れる可能性があるため、メソッドのコア性を見直す際にはそれほど重点を置く必要はありません適切なコード。
    • それは声明をログに記録する、アサートまたは実際
  • 1

    引数が無効である可能性が高いかどうかによって異なります。無効な引数です例外またはです。

    try...catchブロックを使用すると、コードがより洗練され、通常の場合より高速に実行されますが、エラーケースはより遅く実行されます。

    このメソッドが無効なデータで何度も呼び出されると、アプリケーションの潜在的な遅いポイントとなり、フォームのコードが少し効率的になります。

    +0

    私はあなたが何を言おうとしているのか見ていますが、try..catchブロックを使用している場合、パラメータのチェックは次のレベルにある必要があります。メソッド 'Method1'にすることができます。 – Yanshof

    +0

    @ Yanshof - 技術的には、代わりにコードを失敗させるだけです。つまり、nullをチェックして、ArgumentNullExceptionをスローするのではなく、逆参照が失敗してトラップするようにします。 – ChrisF

    関連する問題