C# 从基类中引发的异常获取实际类型
我在应用程序中设置了一系列类,如下所示:C# 从基类中引发的异常获取实际类型,c#,exception,inheritance,C#,Exception,Inheritance,我在应用程序中设置了一系列类,如下所示: abstract class Foo<TYPE> where TYPE : new() { public void Error() { List<TYPE> foo = null; foo.Add(new TYPE()); } } class Bar : Foo<int> { } 抽象类Foo,其中类型:new() { 公共无效错误() { 列表foo=n
abstract class Foo<TYPE> where TYPE : new()
{
public void Error()
{
List<TYPE> foo = null;
foo.Add(new TYPE());
}
}
class Bar : Foo<int>
{
}
抽象类Foo,其中类型:new()
{
公共无效错误()
{
列表foo=null;
添加(新类型());
}
}
酒吧类别:富
{
}
当调用
Bar.Error()
引发异常时,堆栈跟踪会简单地将其报告为位于Foo'1.Error()
中。我确切地知道它为什么会这样做,但我需要知道它是一个Bar
对象实际抛出了错误。我怎样才能从抛出的异常对象中得到它呢?你不能,只是从一个你无法控制的异常中。在异常中没有指示在生成异常时发生了什么实例执行了一个方法
我建议使用调试器(以便在引发异常时可以中断)和/或使用更多诊断日志记录。(例如,在方法的开头记录this
的类型。)
原始答案,当方法本身直接抛出异常时
(为子孙后代保存此文件-可能对其他人有用。)
您可以使用Source
属性,或者Data
属性来记录类型或实例的名称。例如:
abstract class Foo<TYPE>
{
public void Error()
{
throw new Exception("Whoops") { Data = {{ "Instance", this }} };
}
}
然而,这是一个非常奇怪的用法。抛出您自己的自定义异常类型可能更合适,因为它明确知道生成它的实例。您可以尝试编写具有类型属性的自定义异常类型,如
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;
}
}
我的问题不是很明确,但不应该有错误。我只是很难找到答案,因为我不知道该关注哪个儿童班。已编辑以包含系统生成的异常。@Bobson:Oh。这完全改变了问题。不,没有办法知道。我建议调试或更多诊断日志记录。令人失望。这并不奇怪,但这肯定会让追踪变得更加困难。谢谢@Bobson:正如一些可能有助于避免问题的信息一样:合成设计,因为它通常没有层次结构,所以没有这个问题。所讨论的类本身就是它的所有者。很抱歉,我编辑了这个问题-我实际上并没有抛出异常,只是试图跟踪一个系统异常。您可以修改条来覆盖错误(并让它调用base.Error()
然后查看堆栈跟踪?或者您没有访问该源的权限吗?@JohnGibb-我可以,但我必须为Foo
的每个子级执行此操作,其中当前有五个左右。这是可行的,但很难长期维护。请尝试查看异常.TargetSite.DeclaringType
和异常.TargetSite.reflectedype
,其中一个可能会向您显示实际类型,但我不确定,因此我不想将此作为答案提交。我测试了这两个建议,但都不起作用,fyii如果您可以修改Foo
,我会提前验证该值并抛出异常。在这种情况下,您可以获得t
的额外优势。
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;
}