2016-06-01 2 views
2

私にはcatch (Exception ex)が必要です。メッセージを変更してから、再スローしてください。実際のタイプを保持する新しいメッセージでExceptionとRethrowをキャッチ

I throw new Exception(newMessage, ex);の場合、例外のランタイムタイプが失われます。

I throw;の場合、実行時の型は保持できますが、メッセージは変更されません。

私はキャッチしているので、派生型exがどのようなものか分からないため、適切な型を構築できません。

もちろん、もし私がthrow ex;なら、私はスタックトレースを失います。

exのメッセージを再フォーマットし、任意の奇妙な脆い反射ハックに頼ることなく、スタックまたは実行時型情報を失うことなく、それを再スローする方法はありますか?

+0

他の型(アプリケーションの種類は?)を投げて、元の例外を内部例外として設定します。 –

+0

なぜ、InnerExceptionの最も内側の例外を使うことができないのですか?あなたはどこかに "catch"型付きを持っていますか? –

+0

ベース 'Exception'クラスから派生したカスタム例外クラスを使用する必要があります。このようにして、元の例外がマルチレイヤー・アーキテクチャーでどのレイヤーで発生したかを追跡し、すべての例外を1か所に記録することができます。 – Koder101

答えて

2

この問題に対するすべての合理的な解決策を効果的に排除したため、残っている唯一の答えは「いいえ、これはできません」です。 ExceptionMessageは読み取り専用です。プロパティはvirtualであるため、特定の例外タイプのためにバッキングフィールドからまったく来る必要はないため、「脆弱反射ハッキング」を使用して設定することさえできません。以下のクラスは、あなたの要求の不可能性を証明する必要があります

sealed class OzymandiasException : Exception { 
    public override string Message => "Look upon my message, ye mighty, and despair."; 
} 

異なるMessageを持つことになり、そのキャッチするときOzymandiasExceptionの任意のインスタンスを生成する方法はありません。

関連する問題