【问题标题】:Custom exceptions and base constructor自定义异常和基本构造函数
【发布时间】:2013-01-26 07:51:37
【问题描述】:

我一直在尝试编写自己的自定义构造函数,但收到关于 base() 构造函数的错误。我也一直在寻找如何解决这个错误,但一无所获,互联网上的所有示例都显示与我几乎相同的代码。

整个 Exception.cs 内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace RegisService
{
public class Exceptions : Exception
{        
}

  public class ProccessIsNotStarted : Exceptions
  {
      ProccessIsNotStarted()
          : base()
      {
          //var message = "Formavimo procesas nestartuotas";
          //base(message);
      }

      ProccessIsNotStarted(string message) 
          : base(message) {}

      ProccessIsNotStarted(string message, Exception e)
          : base(message, e) {}
  }
}

base() 的第一个重载正在工作,没有引发错误。第二个和第三个 重载告诉我:

"RegisService.Exceptions 不包含一个构造函数 1(2)个论点”

我一直在尝试解决错误的另一种方法:

ProccessIsNotStarted(string message)              
    {
        base(message);
    }

    ProccessIsNotStarted(string message, Exception e)
    {
        base(message, e);
    }

这一次,VS 告诉我:

“在此上下文中使用关键字'base'无效”

那么,问题出在哪里?看起来base() 构造函数有一些奇怪的重载,或者我以不恰当的方式调用它?

【问题讨论】:

    标签: c# exception base custom-exceptions


    【解决方案1】:

    您的Exceptions 类需要定义您要提供的所有构造函数。 System.Exception 的构造函数不是虚拟的或抽象的。关键字base 不会调用所有基类的成员,而是调用您在类声明中提供的一个基类的成员。看看这个:

    public class Exceptions : Exception
    {
        public Exceptions(string message)
            : base(message) {}
    }
    
    public class ProccessIsNotStarted : Exceptions
    {
        public ProccessIsNotStarted()
            : base()
        {
        }
    
        public ProccessIsNotStarted(string message) 
            : base(message)
        {
            // This will work, because Exceptions defines a constructor accepting a string.
        }
    
        public ProccessIsNotStarted(string message, Exception e)
            : base(message, e) 
        {
            // This will not work, because Exceptions does not define a constructor with (string, Exception).
        }
    }
    

    默认情况下会定义无参数构造函数。要隐藏它,您需要声明它private

    关于MSDN,您应该保持异常继承层次结构平坦:

    如果您正在设计需要创建自己的异常的应用程序,建议您从 Exception 类派生自定义异常。最初认为自定义异常应该从 ApplicationException 类派生;然而,在实践中,这并没有增加显着的价值。

    你也可以看看this page

    【讨论】:

    • 谢谢你,它有帮助。我只需将public 添加到每个Exceptions 过载。
    【解决方案2】:

    完全删除Exceptions 类,让ProccessIsNotStarted 直接从System.Exception 继承。

    are not automatically "copied" to derived classes的构造函数;它们可以使用base 获得,但您必须手动定义它们。

    【讨论】:

      【解决方案3】:

      base 指的是直接基类,而不是链下的任何基类。您的 ProcessIsNotStarted 类是 RegisService.Exceptions 的直接子类型,而不是 System.Exception。 RegisService.Exceptions 没有带有签名 (string, Exception) 或 (string) 的构造函数。

      尝试将这两个构造函数添加到您的 RegisService.Exceptions 基类中。

      【讨论】:

        【解决方案4】:

        如果您检查以下代码:

        public class Exceptions : Exception
        {        
        }
        

        你会注意到有 no 构造函数。嗯,这是一个谎言,因为可以使用默认的公共构造函数,但是没有自定义的构造函数。

        如果您想通过Exceptions 公开Exception 的构造函数,那么您将不得不在Exceptions 上定义它们并从那里使用base 调用它们,因为继承调用base 的异常是调用Exceptions,因此Exception 不是他们的base,因此构造函数无法访问。

        public class Exceptions : Exception
        {        
            Exceptions(string message) 
              : base(message) { }
        
            Exceptions(string message, Exception e)
              : base(message, e) { }
        }
        

        那么,new Exceptions("", null) 就可以了。此外,您的基本构造函数在使用继承时调用。

        我不知道你是否从这个继承链中获得了任何价值,并且你可能想要取出中间人,可以这么说,根据另一个建议。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-15
          • 1970-01-01
          • 1970-01-01
          • 2010-12-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-07
          相关资源
          最近更新 更多