我有一个组件,它使用返回值处理错误,而不是标准的异常处理。除了错误代码之外,它还返回错误发生位置的堆栈跟踪信息。我用来调用该组件的包装器将解释返回代码并抛出异常。
我希望包装器抛出一个异常,其中包含从组件捕获的堆栈跟踪信息。我希望它看起来就像异常是从错误的原始位置抛出的,即使它是从其他地方抛出的。 更具体地说,我希望Visual Studio测试运行器显示的堆栈跟踪反映正确的位置。
有没有办法做到这一点?如果我可以避免访问私有成员的低级反射技巧,那就太好了,但我会尽力而为。
我不关心如何捕获堆栈跟踪,我关心的是将已经捕获的堆栈跟踪附加到异常上。
我尝试重写StackTrace属性,但是Visual Studio似乎从其他地方提取堆栈跟踪数据,并完全忽略重写的属性
CustomException GenerateExcpetion()
{
return new CustomException();
}
void ThrowException(Exception ex)
{
Trace.WriteLine("Displaying Exception");
Trace.WriteLine(ex.ToString());
var edi = ExceptionDispatchInfo.Capture(ex);
edi.Throw();
}
[TestMethod]
public void Test006()
{
var ex = GenerateExcpetion();
ThrowException(ex);
}
public class CustomException : Exception
{
string _stackTrace;
public CustomException()
{
_stackTrace = Environment.StackTrace;
}
public override string StackTrace
{
get
{
return base.StackTrace;
}
}
}
Exception.ToString()
方法会从一个私有属性中提取堆栈跟踪数据,因此不会显示覆盖版本的堆栈跟踪。CustomException: Exception of type 'CustomException' was thrown. ExceptionDispatchInfo 也会查找私有属性中的堆栈跟踪数据,所以找不到任何该数据,当您抛出这个自定义异常时,一个新的堆栈跟踪会附加到异常上,并带有其被抛出的位置。如果直接使用 throw,那么私有的堆栈信息将设置为 throw 发生的位置。