2011-11-10 14 views
4

私は、スタックトレースを調査しています、と私は、この出力accrossに来た:例外:

Server stack trace: 
    ... 
    at MyProject.Data.Notifications.NotificationCache.InitialisedCache() in NotificationCache.cs: line 72 
    at System.Lazy`1.CreateValue() 

Exception rethrown at [0]: 
    at System.Lazy`1.get_Value() 
    at MyProject.Data.Notifications.NotificationCache.AddItemToCache(NotificationDto dto) in NotificationCache.cs: line 82 
bla bla bla 

誰かが何Exception rethrown at [0]:手段を説明し、それを複製する方法をいくつかの単純なシナリオを示していただけますか? 私はtry/catch/throw、try/catch ex/throw exなどでレプリケートしようとしましたが、できませんでした。

+1

NotificationCache.csから82行目と72行目の行をポストできますか? –

+0

これは単なる例であり、重要ではありません。私は[0]で例外が再現されたときに、うまくいかないことを望みます:何が起こっているのですか、それはなぜですか?私は非同期呼び出しで何かがあるかもしれないと思うが、私は間違っているかもしれない。この特定のケースでは、プライベートメソッドLazyのソースコードが見つかりました .CreateValue http://typedescriptor.net/browse/members/249448-System.Lazy%601%5BT%5D.CreateValue%28%29#しかし私はなぜ[0]で例外が再現されたのかわかりません。私の単純なコンソールアプリケーションの例では再スローされていません。 – xhafan

+0

はい、82行目で再スローが起こっています。あなたの質問に82行目の周りに投稿してください。コードをダウンロードしてコードをダウンロードする必要はありません。 (カウントをオフにすることができるように追加または削除したかどうかはわかりません) –

答えて

4

Lazy<T>.CreateValueException.PrepForRemoting()を呼び出します。ここでは[0]ビットで再スローされたビットが追加されます。これは著者の一部では奇妙なデザインの選択ですが、おそらく彼は例外を引き起こしたコードとそれを呼び出すコードの両方を見ることを可能にする「分割」スタックトレースを得るための方法としてそれを使用していました前者は代理人を介して呼び出されるという事実にもかかわらず、

+0

素晴らしい!スタックトレースに文字列を追加するだけのコードが見つかりました。http://typedescriptor.net/name/members/1168BF1E465B5ACA5B5B4CFAB2CE29CC-System.Exception.PrepForRemoting%28%29 – xhafan

+0

[Exception.PrepForRemoting()]リンクを修正しました。ソースコード](http://dotnetframework.org/default.aspx/[email protected]@1/[email protected]@1/[email protected]@1/DEVDIV/depot/DevDiv/releases/whidbey/NetFXspW7/ndp/clr/ src/BCL/System/Exception @ cs/1/Exception @ cs) – xhafan