我在我的应用程序中设置了一系列类,如下所示:
abstract class Foo<TYPE> where TYPE : new()
{
public void Error()
{
List<TYPE> foo = null;
foo.Add(new TYPE());
}
}
class Bar : Foo<int>
{
}
当对Bar.Error()
的调用抛出异常时,堆栈跟踪只会将其报告为Foo'1.Error()
。我确切地知道为什么它会这样做,但我需要知道它是一个实际抛出错误的Bar
对象。如何从被抛出的Exception
对象中获取它?
答案 0 :(得分:2)
你不能,只是从一个你无法控制的例外。异常中没有任何迹象表明在生成异常时有一个方法执行的实例。
我建议使用调试器(以便在抛出异常时可以中断)和/或使用更多诊断日志记录。 (例如,在方法开头记录this
的类型。)
原始答案,当方法本身直接抛出异常
时(为后人保留这一点 - 对其他人可能有用。)
您可以使用Source
属性,或者Data
属性来记录类型或实例的名称。例如:
abstract class Foo<TYPE>
{
public void Error()
{
throw new Exception("Whoops") { Data = {{ "Instance", this }} };
}
}
...然后使用:
catch (Exception e)
{
var instance = e.Data["instance"];
// Use the instance
}
然而,这是一个非常奇怪的用法。抛出自己的自定义异常类型可能更合适,显式知道生成它的实例。
答案 1 :(得分:0)
您可以尝试编写具有Type属性的自定义Exception类型,例如
public class CustomException : Exception {
public Type ExceptionSourceType{get;set;}
}
abstract class Foo<TYPE>
{
public void Error()
{
var exception = new CustomException ("Whoops");
exception.ExceptionSourceType = this.GetType();
throw exception;
}
}
然后,如果您专门捕获这些类型的错误,您可以轻松访问该属性
catch(CustomException ex){
var sourceType = ex.ExceptionSourceType;
}