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

时间:2013-02-11 08:23:06

标签: c# exception base custom-exceptions

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

Whole 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 个答案:

答案 0 :(得分: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类;但实际上并没有发现增加显着的价值。

您也可以查看this page

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

如果您检查以下代码:

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)做得很好。而且,你的基础构造函数在使用继承时调用。

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