2012-11-27 14 views
5

msdn linkには、
System.ExceptionまたはSystem.SystemExceptionをスローしないでください。私は 例外をキャッチしてスローするためのベストプラクティス

このような
private MsgShortCode GetshortMsgCode(string str) 
     { 
      switch (str.Replace(" ","").ToUpper()) 
      { 
       case "QNXC00": 
        return MsgShortCode.QNXC00; 
       default: 
        throw new Exception("Invalid message code received"); 
      } 
     } 

を投げています私のコードで
これは悪い習慣です??

答えて

9

一般的に、より明示的にすることができます。この場合

、あなたはあなたがより具体的な、より簡単に例外を処理するために、他のコードのためにある

ArgumentException 

を投げることができます。

これは、あなたがArgumentExceptionを投げるべきである。この特定のインスタンスでは

try 
{ 
    GetshortMsgCode("arg") 
} 
catch(ArgumentException e) 
{ 
    //something specific to handle bad args, while ignoring other exceptions 
} 
3

を行うことができます。

特定の例外タイプの主な点は、呼び出し側の観点から考えることです。私は実際には、両方の実装の詳細を理解しているときにも、コーリングコードを記述しているときには、かなり難しいと理解しています。しかし、発信者に何か悪いことがあった場合にはどうすればよいかを明確に理解するための十分な情報をどのように提供できるのか常に考えてみてください。

この場合、単にExceptionを投げると、エラーメッセージを解析して、間違ったことを理解する必要があることを意味します。ArgumentExceptionは、あなたに何か無効なものを渡した他の理由で正しく実行されませんでした。

1

「悪い練習」のような用語を使用することには消極的です。なぜなら、状況によってはほとんどすべてが正しいからです。しかし、通常、あなたの状況に存在する最も具体的な例外をスローする方が良いと考えられます。特定のものが存在しない場合は、例外を定義する必要があります。

Exceptionを投げた場合、呼び出し元は、発生したエラーと、コードの呼び出し中にシステムによってスローされたその他の例外を区別できません。

多くの場合、呼び出し側は例外を他の問題とは異なる方法で処理するか、例外が発生したことを知らせるメッセージを記録することがあります。例外が他のものと簡単に区別できない場合は、呼び出し元が達成するのが難しいでしょう。