2011-09-06 17 views
6

例外をスローしたいのですが、カスタムメッセージとスタックトレースを残したいと思います。私は様々なスレッドを行ってきました。例外をスローしますがスタックトレースを保持します

**The remote server returned an error: (401) Unauthorized.** 

[WebException: The remote server returned an error: (401) Unauthorized.] 
original stack trace 

[NewException: newMessage] 
New Stack Trace 

良いことは、すべてが画面上に存在しているである:最後appraochは死の画面上で、出力(カスタム例外基底クラスのコンストラクタを呼び出すコンストラクタで)使用されている

catch (Exception ex) 
{ 
throw; // Message is read only but stacktrace persist 
throw ex; // Message is readonly and strack trace also blows .. worst! 
throw new CustomException("My exception");// Message can be overridden but stacktrace lost 
throw new CustomException("My message",ex);// same as above. However if this constructor in exception class calls same constructor of base class then .. see below 
} 

は何かのようなものです。しかし、上に私の例外、すなわち「新しいメッセージ」を表示し、元のメッセージではないことを望みます。

私の質問を調整します:元のスタックトレースが表示されますが、カスタムエラーメッセージが表示されます。

+1

が、これは例外を返すWebサービスですか? – Oded

+0

私の例では、それは確かにwebservice呼び出しです。しかし、例外はDivisionByZeroやsqlExceptionなどのようなものであったため、重要ではありません。アイデアは元のスタックトレースをユーザーに知らせることですが、開発者はデフォルトの例外メッセージをより役立つものにカスタマイズすることもできます。 – helloworld

+0

いいえ、それは重要ではありません。 Webサービスのフレームワークには、例外に関する独自のアイデアがあります。 –

答えて

8
throw new CustomException("My message",ex);// same as above (... stacktrace lost) 

最後のコメントの結論は間違っています。 stacktraceは内側Exceptionに保持されます。標準レポート(Exception.ToString()を含む)は、完全なスタックトレースを報告します。これはコンストラクターを正しく取得したときに表示されます。 (常に正しいベースctorを呼び出してください!)。

しかし、私は[WebException]を認識しません。あなたが必要とするWCFで

<serviceDebug includeExceptionDetailInFaults="true"/> 

あなたのWeb環境には、クライアントに対するエラー情報を抑制する同様の機能があると思います。

3

4つ目のアプローチは、一般的な方法と確立されたパターンです。あなたは、例外処理(または発生)をどのように表示または記録されているか、または何かと混同してはいけません。

制御下にある(キャッチされた)例外の出力がある場合、つまりそれぞれのコードを変更/書き込める場合は、Exception.ToString()メソッドを使用するだけで、すべての「内側」例外も出力されます。

備考: アプリケーションによって意図的に内部例外が表示されないことがあります。たとえば、WCF(Windows Communication Foundation)では、IncludeExceptionDetails(config、code、...経由)が設定されていない限り、内部例外はサーバーからクライアントに転送されません。これは通常、内部例外が実装の詳細とみなされるために行われます。これにより、攻撃者はアプリケーションを破壊する貴重な情報を得ることができます。

0

StackTraceプロパティのオーバーライドはどうですか?

class CustomException : Exception { 

    public CustomException(string message, Exception inner) : base(message, inner) { 
    } 

    public override string StackTrace { 
     get { 
      if (InnerException != null) { 
       return InnerException.StackTrace; 
      } 
      return base.StackTrace; 
     } 
    } 
} 
+0

ありがとう!試してみました...黄色い画面が表示されている間に、InnerException.Stacktraceが3回呼び出され、元のスタックトレースが表示されるたびにブレークインしました。しかし、変わったことは、まだ新しいスタックトレースが表示されていることです( – helloworld

+0

@enableDeepak:それは宇宙が崩壊する原因になるかどうかわかりませんでした... –

0

私はオプション4は、一般的に最高で、同意...

最終的にしかし、開発中に、私は、の#if(!DEBUG)の内側全体catch節を入れて、それは非常に便利デバッグモードでコンパイルできるようにするには、次のようにします。

#if (!DEBUG) 
catch (Exception ex) 
{ 
    // Catch logic for Release mode 
} 
#endif 
finally { } 

これにより、APIが最上位レベルではなくエラーが発生した時点でブレークされます。

#ifの習慣をつけないでください...ほぼすべての他の例では、法の前で

[Conditional("DEBUG")] 

を使用する代わりに

関連する問題