自定义异常和基构造函数
本文关键字:构造函数 自定义异常 | 更新日期: 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
{
}
您会注意到没有构造函数。这是一个谎言,因为可以使用默认的公共构造函数,但没有自定义的构造函数。
如果你想公开Exception
到Exceptions
的构造函数,那么你必须在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)
做得很好。此外,在使用继承时,您的基构造函数会调用。
我不知道你是否从这个继承链中获得了任何价值,可以说,根据另一个建议,你可能想去掉中间人。