2009-04-15 15 views
6

このようなコードにお考えどのようなものです:思考が

public void doSomething() 
{ 
    try 
    { 
     // actual code goes here 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
} 

は私が見る問題は、実際のエラーがちょうど別の場所で例外を投げ、処理されていませんです。実際の問題がどこにあるのか分からないので、デバッグするのがより難しいと思う。

私の質問はなぜこれが良いのでしょうか?

---- EDIT ----

ほとんどの人はそれがカスタムまたは巻き込まれる特定の例外なしでこれを行うには無意味だと言っているように見えるの回答から。特定の例外がキャッチされていないときに、コメントしたいと思ったのです。私は実際には、このコードのやり方ではなく、キャッチされた例外を使って実際に何かをしている点を知ることができます。

答えて

15

あなたが見ている品質によっては、例外を別の場所に投げているわけではありません。ターゲットを持たない「スロー」は、例外をスローすることとは非常に異なる例外を再起する。主に再スローでスタックトレースがリセットされることはありません。

この特定のサンプルでは、​​何もしないためキャッチは無意味です。例外はうれしいことに再現され、try/catchが存在しない場合とほぼ同じです。

+0

で「Release IS NOT Debug: 64bit Optimizations and C# Method Inlining in Release Build Call Stacks」を参照してください理由について記事全文については

。通常はデバッグ中に挿入されるため、誰かが 'スロー'にブレークポイントを置くことができます。 –

+0

@Joel、gotcha。より良い解決策は、スローを打ち破るためにVSを使うことです。しかし、それほどきめ細かではありません:( – JaredPar

+0

ブレークポイントの利点は、ユニットテスト中に非常に有用であることが多い重要ではないエラーの詳細を記録できることです! –

0

一般的な例外がこのようにキャッチされ、カスタムの例外オブジェクトに再パックされたインスタンスがあります。

違いは、これらのカスタムExceptionオブジェクトには、発生した実際の例外に関する情報が少なくないことです。

3

私はあなたがあなたのコードの中で投げていることを知っている例外を処理するために構築を使うべきだと思う。他の例外が発生した場合は、ただ再スローします。

をスローします。 は と異なります。

例外をスローすると、スローする新しいポイントにスタックが切り捨てられ、例外に関する貴重な情報が失われます。初心者のためのよく

public void doSomething() 
{ 
    try 
    { 
     // actual code goes here 
    } 
    catch (EspecificException ex) 
    { 
     HandleException(ex); 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
} 
+1

あなたの例ではcatch(Exception ex)は必要ありません。Exceptionを処理しないだけで同じ効果が得られます。 –

0

私は単に

catch 
{ 
    throw; 
} 

を行うだろうが、あなたは、例外の複数の種類を捕獲している場合、基本的に、あなたは、いくつかのローカルおよびスタックアップ他人バックを処理することもできます。

そのかなり無意味であり、一般的に、私は無意味な物事の道を行くしないようにしてくださいのようなものをやって
catch(SQLException sex) //haha 
{ 
    DoStuff(sex); 
} 
catch 
{ 
    throw; 
} 
1

;)

ほとんどの部分については、私はその例外の特定の種類をキャッチ信じていますより多くの情報で独自の例外を作成し、キャッチされた例外をInnerExceptionとして使用することを意味しています。

0

「このように見える」という意味に依存し、キャッチブロックには何も表示されず、再スローされます...そうであれば、例外キャッチは無意味ですが、あなたが言うように、例外がどこで発生したのかを難読化することはできません。しかし、エラーが発生した場所ですぐに何かを行う必要があるが、スタックを越えて例外を処理したい場合は、これが適切かもしれません。しかし、その後、キャッチは、あなたがhandlある特定の例外のためになる。いない例外のために、INGの

3

それは、理想的にcatchブロックは例えば、いくつかの処理を行い、その後、再スローだろう、ではないでしょう

try 
{ 
    //do something 
} 
catch (Exception ex) 
{ 
    DoSomething(ex); //handle the exception 
    throw; 
} 

もちろん、コードの上位層で何らかの処理をしたい場合は、再スローが便利です。

1

時には、これは適切です - コールスタックの上位の例外を処理するとき。しかし、キャッチブロック内で何かをする必要があります。エラーをログに記録してください:

public void doSomething() 
{ 
    try 
    { 
     // actual code goes here 
    } 
    catch (Exception ex) 
    { 
     LogException (ex); // Log error... 
     throw; 
    } 
} 
0

エラーを再現するだけで便利だとは思いません。あなたが本当に最初の場所でエラーを気にしない限り。

私は、キャッチで実際に何かをする方がよいと思います。

MSDN Exception Handling Guideを確認できます。

0

通常、何もしない例外処理ブロックを持つことはまったくうまくいかないため、コードを最適化してパフォーマンスを向上させると、.Net仮想マシンがメソッドをインライン展開することができないという単純な理由があります。私は前に、このようなコードを見てきました​​

関連する問題