自定义异常和基构造函数

本文关键字:构造函数 自定义异常 | 更新日期: 2023-09-27 17:58:48

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

完整例外.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()构造函数有一些奇怪的重载,或者我用不合适的方式调用它?

自定义异常和基构造函数

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类,并让ProccessIsNotStarted直接从System.Exception继承。

类的构造函数不会自动"复制"到派生类;它们可以使用base使用,但您必须手动定义它们。

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

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

如果您检查以下代码:

public class Exceptions : Exception
{        
}

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

如果你想公开ExceptionExceptions的构造函数,那么你必须在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)做得很好。此外,在使用继承时,您的基构造函数会调用。

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