2011-06-29 2 views
24

私はこれが簡単だと思っています。私は、全体的な品質は良いですが、大規模なコードベースで動作しますが、時折、あなたはこれらのいくつかの取得:スローで空のキャッチを削除できますか?

try 
{ 
    // Calls a .NET remoting method. 
} 
catch 
{ 
    throw; 
} 

注意がロジックが最終的にノーであるとキャッチが例外を指定するか、またはもの以外何もしませんが私は上記で提供しました。しかし、catchingとre-throwingが例外の詳細でcall-stackを変更できることを私は知っています。私が確信していないのは、.NETリモート呼び出しのためにこの動作が特にある場合です。

このtry-catchを削除しても安全ですか?私が見る限りでは、それはありますが、私は何か奇妙な行動が最初に確認されると思いました。

+2

興味@Danあなたが質問を考える理由変更が必要でしたか? –

+1

タイトルを変更することは微妙なことですが、より検索可能と思えば編集する傾向があります。 http://www.google.com/?q=can+i+remove+empty+catch+with+throwは今すぐあなたの質問を一番上の回答として示しています。これは人々が入力する可能性が高いクエリですあなたの元のタイトルよりも。 –

+0

十分に公正で、それは検索のための疑いがあった。 –

答えて

14

私が知る限り、catch (Exception ex) { throw ex }はスタックトレースをリセットします。ちょうどcatch { throw; }はありません。

エラー時に追加のロジックを実行しないと、ロギング、私はそのキャッチを削除しない理由を知らない。

21

これまでに示したようにを再送してください。は、リモーティング例外に関して特別なことがない限り、コールスタックを変更しないでください。 (私はいくつか特別な側面がある知っているが、私は、彼らがここに遊びに来ないと思います)これは失う情報をするものの一種である:

catch(Exception e) 
{ 
    throw e; // Not throw; 
} 

マイ推測は、ということですいくつかの開発者がこれを含めて、throw行にブレークポイントを置くことができます。私はそれを取り除くだろう。

+3

'throw'だけを使用すると、スタックトレースを変更することができます** **例外が' throw'文と同じスタックフレームでスローされた場合 - この場合、行番号は 'throw'文の行にリセットされます(例外はもともと例外が投げられた行ではなく) – Justin

+2

これは取り除かれました。私が今必要とするのは目立たない欠陥番号です:-) –

4

コードアクセスセキュリティに関連する特定の状況では、catch-rethrow句は必要なセキュリティ機能です。しかし、私はそれがここに当てはまるのか疑問です。特に、正気の人はこのパターンをコメントを付けずに使用するからです。

特権が増えている間に例外フィルタが実行されないようにすることがポイントです。

いくつかの関連記事:

http://blogs.msdn.com/b/shawnfa/archive/2005/03/31/404320.aspx
http://msdn.microsoft.com/en-us/library/8cd7yaws(v=VS.100).aspx
http://www.pluralsight-training.net/community/blogs/keith/archive/2005/03/31/7149.aspx


.NET 2以降廃止されているように見える:
Impersonation and Exception Filters in v2.0

+0

私たちはそうではありませんCASを使用します。しかし、面白い情報、ありがとう。 –

関連する問題