Custom exceptions and base constructor
我一直在尝试编写自己的自定义构造函数,但在
整个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) {} } } |
第一个使用
"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"
那么,问题在哪里?看起来
您的
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 { } |
您会注意到没有构造函数。嗯,这是一种谎言,因为可以使用默认的公共构造函数,但是没有自定义的构造函数。
如果要通过
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基类中。
将
类的构造函数不会自动"复制"到派生类;它们可以使用