关于c#:自定义异常和基础构造函数

Custom exceptions and base constructor

我一直在尝试编写自己的自定义构造函数,但在base()构造函数方面出错。我也一直在搜索如何解决这个错误,但没有发现任何问题,而且互联网上的所有示例都显示了几乎与我相同的代码。

整个exception.cs内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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 does not contain a constructor that takes
1(2) arguments"

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

1
2
3
4
5
6
7
8
9
ProccessIsNotStarted(string message)              
    {
        base(message);
    }

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

这次,vs告诉我:

"Use of keyword 'base' is not valid in this context"

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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).
    }
}

默认情况下,将定义无参数构造函数。要隐藏它,你需要在cx1〔16〕上声明。

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

If you are designing an application that needs to create its own exceptions, you are advised to derive custom exceptions from the Exception class. It was originally thought that custom exceptions should derive from the ApplicationException class; however in practice this has not been found to add significant value.

你也可以看看这个页面。


如果检查以下代码:

1
2
3
public class Exceptions : Exception
{        
}

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

如果要通过Exceptions公开Exception的构造函数,则必须在Exceptions上定义它们,并使用base从那里调用它们,因为继承调用base的异常调用Exceptions,因此Exception不是它们的base,因此构造函数不可访问。e.

1
2
3
4
5
6
7
8
public class Exceptions : Exception
{        
    Exceptions(string message)
      : base(message) { }

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

那么,你可以做的很好。另外,在使用继承时调用基本构造函数。

我不知道你是否从这个继承链中得到了任何价值,而且你可能想按照另一个建议,把中间人带走。


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

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


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

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