也许在C#中对我来说最神秘的事情是Exception类的消息属性是只读的。可能是因为我不明白这个原因,当我尝试创建从异常派生的合理的异常类时,我很沮丧。为什么异常消息属性是只读的?
例如(实际上我正在尝试做什么),我想创建一个异常以在尝试连接到OPC服务器时引发。如果尝试失败,则会引发OPCException类型的对象,但我想给用户提供更多信息。所以,我有一个名为OPCCaException的类,它有三个参数:原始异常的返回码,服务器名称和主机名。
public class OPCCaException : Exception
{
public OPCCaException(ReturnCode returnCode, string serverName, string nodeName)
{
if (nodeName == "")
{
this.Message = "Failed to connect to OPC server "+ serverName +
": " + TranslateReturnCode()";
}
else
{
this.Message = "Failed to connect to OPC server "+ serverName +
" on node " + nodeName +
": " + TranslateReturnCode()";
}
}
}
这对我来说似乎是一个完全合理的事情,但它不会编译,因为Message属性是只读的。设置消息的唯一方法是将其传递给基类构造函数。为什么我不能在派生类的构造函数中设置它?我能想到的做任何类型的处理上争论的唯一方法是创建一个静态类构建消息:
public class OPCCaException : Exception
{
private static string BuildMessage(<some arguments>)
{
string message = "some message";
return message;
}
public OPCCaException(ReturnCode returnCode, string serverName, string nodeName) :
base(BuildMessage(returnCode, serverName, nodeName))
{
}
}
我不知道这是否会进行编译。
这是做什么的标准方法?
不,我没有注意到消息是虚拟的。非常感谢所有你指出的人。很抱歉,我在这里没有足够的声誉来提高答案。 – 2013-03-07 20:44:29