也许 C# 中对我来说最神秘的事情是 Exception 类的 message 属性是只读的。可能是因为我不明白其中的原因,当我尝试创建从 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))
{
}
}
我不知道这是否会编译。
执行此操作的标准方法是什么?