自定义异常和基础构造函数

3

我一直在试着编写自己的自定义构造函数,但是出现了关于 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()构造函数有一些奇怪的重载,或者我调用的方式不正确?
4个回答

6

您的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类派生; 但是,在实践中发现这并没有添加重大价值。

您还可以查看此页面

谢谢,这很有帮助。我只需要在每个“Exceptions”重载中添加“public”。 - Masius

1
如果你查看以下代码片段:
public class Exceptions : Exception
{        
}

你会注意到没有构造函数。这有点不准确,因为可以使用默认的公共构造函数,但没有自定义的构造函数。
如果你想通过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)。并且,在使用继承时调用基础构造函数。
我不知道您是否从这个继承链中获得任何价值,您可能希望按照另一个建议去掉中间人。

1
完全删除 Exceptions 类,让 ProccessIsNotStarted 直接继承自 System.Exception
类的构造函数 不会自动“复制”到派生类;它们可以使用 base 访问,但必须手动定义。

1
“base”指的是直接基类,而不是继承链中的任何基类。您的ProcessIsNotStarted类是RegisService.Exceptions的直接子类型,而不是System.Exception。RegisService.Exceptions没有使用(string, Exception)或(string)签名的构造函数。
请尝试将这两个构造函数添加到RegisService.Exceptions基类中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接