Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从基类中引发的异常获取实际类型_C#_Exception_Inheritance - Fatal编程技术网

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;
}