参照されたライブラリによってスローされたすべての例外が自分のライブラリをエスケープしないようにしたいと考えています。私は、MyException
型でない場合に例外をラップする try catch を介してすべての関数をフィルタリングすることによってこれを行っています。私が抱えている問題は、例外がMyException
タイプの場合、ラップ関数で、新しい場所から同じ例外を再スローし、最初にスローされた例外を埋め込まないため、元のスタック トレースが失われてしまうことです。スタック トレースは、例外が再スローされる新しい場所から記録されるため、元のスタック トレースthrow
は失われます。
public static Exception Wrap(Exception exception)
{
Exception exceptionToReturn;
if (exception is MyException)
{
exceptionToReturn = exception;
}
else
{
exceptionToReturn = new MyException("Referenced library exception wrapped", exception);
}
return exception;
}
私がやろうとしているのはMyException
、元のスタック トレースを保持するために派生したのと同じ種類の例外を再スローすることです。MyException
ただし、次のようなコードですべての子をチェックしたくありません。
(exception is ChildOfMyException)
exceptionToReturn = new ChildOfMyException(exception.Message, exception);
ジェネリックを使用する場合。明示的なコンストラクターを指定できません。
public static Exception Wrap<TException>(TException exception)
where TException : Exception, new()
{
Exception exc;
if (exception is MyException)
{
exc = new TException();
}
else
{
exc = new MyException("Referenced library exception wrapped", exception);
}
return exc;
}
不足している方法がありますか、それともリフレクションを使用して _innerException
フィールドを変更する必要がありますか。