Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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,你好 我创建了两个类: class A { public A(String name) {} public void Func1() { try {...} catch(Exception ex) { Console.WriteLIne("Error at Func1 of class A"+Ex.Message); } } } class B:A { public B() {} } 在Ma

你好

我创建了两个类:

class A
{
  public A(String name) {}
  public void Func1()
  {
      try 
      {...}
      catch(Exception ex)
      {
        Console.WriteLIne("Error at Func1 of class A"+Ex.Message);
      }
  }
}

class B:A
{
   public B()  {}
}
在Main():

当出现异常时,会出现如下错误:“类a Func1出错”! 所以,我很困惑

a怎么能修好它?我是否应该重写类A的每个函数并这样做:

void override Func1()
{
  try {
    _a.Fun1();
  }
  catch(Exception ex)
  {//My text of exception}
}
还是弹劾接口? 请告诉我


谢谢

覆盖是一种选择,但它非常奇怪

相反,您可以使用
this.GetType()
获取您实际所在类型的名称:

Console.WriteLine("Error at class " + GetType().Name + ": " + Ex.Message);
然而,这是一种有点奇怪的异常处理模式。首先,您打印出的信息在异常的堆栈跟踪中,不需要手动写入方法的名称等。虽然有点冗长,但这通常非常有用

当然,如果仍要遵循此模式,则不必手动写入方法的名称:

"Method " + MethodBase.GetCurrentMethod().Name + ", class " + GetType().Name
这里的要点是,您的
B
类型没有方法
Func1
——它只对
a
的方法
Func1
执行虚拟分派,并引用自身。由于
GetType()
获取给定实例的实际类型(在本例中为
this
),因此即使在继承自基类的类中,也可以获得所需的类型


重写所有类中的所有方法并替换它们的全部代码将完全违背继承的目的,不是吗?

异常堆栈跟踪已经为您提供了这些信息。是否确实要将此文本放入异常中?异常消息通常显示异常的可疑原因-您必须知道发生了什么错误才能抛出异常!听起来,try中发生的任何事情都会引发一个与您提供的结构无关的异常。@但是,Gusdor的一个问题是,您将通过定义该方法的类获得该方法的名称。因此堆栈跟踪将显示
A.Func1
,而不是
B.Func1
。虽然可以理解并且总体上是个好主意,但OP似乎想要运行的实际类型(这很可能意味着他的继承树非常奇怪:D)@user2545071好吧,这里的基本想法是问问自己谁从消息中受益。它是为应用程序的用户提供的吗?他不知道发生这种情况的方法和类的名称。是给你的吗?您可能需要完整的堆栈跟踪,它还显示错误发生的行以及调用方树。另一件重要的事情是问问自己是否在正确的地方处理了异常。用这种方法处理它真的有意义吗,还是应该传播得更高?也许你只想
试试。。。最后
要清理吗?
"Method " + MethodBase.GetCurrentMethod().Name + ", class " + GetType().Name