>我的应用程序中设置了一系列类,如下所示:
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
对象中得出它?
,只是来自你无法控制的异常。异常中没有指示生成异常时哪个实例碰巧执行了方法。
我建议使用调试器(以便在引发异常时可以中断)和/或使用更多的诊断日志记录。(例如,在方法开始时记录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
}
然而,这是一个非常奇怪的用途。抛出您自己的自定义异常类型可能更合适,该类型显式知道生成它的实例。
您可以尝试编写具有 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;
}