2012-02-10 10 views
4

ときどき私はExceptionインスタンスを作成せずに(ハンドラに直接渡すなど)作成します。スタックトレースをキャプチャする方法は?

OnException(new AuthorizationException()); 

スタックトレースを現在の位置で初期化するにはどうすればよいですか?

+0

可能な複製[.NETの現在のスタックトレースをどのように例外なく印刷するか?](http:// stackoverflow。com/questions/531695/how-to-print-the-current-stack-trace-in-net-without-any-exception) – cbp

+0

質問は、現在のスタックトレースをスローすることなく例外にアタッチする方法です。 – Poma

答えて

3

あなたはEnvironment.StackTraceプロパティを使用するか、StackTraceクラスを使用することができます

var stack = new StackTrace(); 
var data = stack.<whatever you need from it> 

をしかし、私はちょうど追加する必要があります:あなたは、概念的に非常に悪いです何をすべきか。

+2

+1最後の文のために! – GazTheDestroyer

+2

これは、ひどく設計されたライブラリのラッパーを使って、少し上手くするためです。 – Poma

+1

良い答えです。 OPがやっていることを「*非常に概念的に悪い」*と考える理由を説明すれば、さらに良いでしょう。それを投げずに例外を作成するのは珍しいことですが、遠くに取り込んだIMHOではできません。 – stakx

3

あなたは、実際には2つの異なる質問(タイトルでは1、最後に他を)求めています。

「スタックトレースを取得する方法」単にstatic System.Environment.StackTrace propertyに照会することによって、またはnew System.Diagnostics.StackTrace();介し

。このプロパティを読み取る

は、すべての例外オブジェクトを構築するためにあなたを必要としないので、おそらくそれはあなたが必要とするすべてです。

「[例外オブジェクトの]スタックトレースを現在の位置で初期化する方法は?」

あなたが実際に例外オブジェクトをthrowまで、例外オブジェクトのStackTrace propertyが初期化されていません。

「スタックトレースは、例外がスローされた時に作成される。これは、スタックトレースは、例外オブジェクトの構築時に作成されたJavaとは対照的です。[&hellip;]。」The Common Language Infrastructure Annotated Standard、ch。 18、p。その後、

最初の質問への答えと相まって
// don't do that: 
class ExceptionWithPresetStackTrace : System.Exception 
{ 
    public ExceptionWithPresetStackTrace(string stackTrace) 
    { 
     this.stackTrace = stackTrace; 
    } 

    public override string StackTrace 
    { 
     get 
     { 
      return stackTrace; 
     } 
    } 
    readonly string stackTrace; 
} 

、あなたは可能性があり:301

それは読み取り専用のプロパティですので、あなたがあなた自身の例外クラスを派生しない限り、あなたが自分—それを初期化することはできません次の操作を行います。

OnException(new ExceptionWithPresetStackTrace(System.Environment.StackTrace)); 

しかし、これは一般的に悪い考えであることが経由で任意のランダムな位置(の開発者を指して例外オブジェクトを作成することが可能となるので、プロパティ)、実際にはエラーが発生していないものも含まれます。これは誤解を招き、避けるべきです。

関連する問題