创建新的异常类型

本文关键字:类型 异常 创建 | 更新日期: 2023-09-27 18:25:06

我想创建新的异常类型,用指定日志记录来捕获它。但我想把int值传递给ctor。怎么做?我尝试:

public class IncorrectTimeIdException : Exception
{
    public IncorrectTimeIdException(int TypeID) : base(message)
    {
    }
}

但我在编译过程中出错了。

创建新的异常类型

public class IncorrectTimeIdException : Exception
{
    private void DemonstrateException()
    {
        // The Exception class has three constructors:
        var ex1 = new Exception();
        var ex2 = new Exception("Some string"); // <--
        var ex3 = new Exception("Some string and  InnerException", new Exception());
        // You're using the constructor with the string parameter, hence you must give it a string.
    }
    public IncorrectTimeIdException(int TypeID) : base("Something wrong")
    {
    }
}

以下是一些代码,您可以用来创建一个自定义异常类,该类携带一些额外的数据(在您的情况下是类型ID),并遵循创建自定义异常的所有"规则"。您可以根据自己的喜好重命名异常类和非描述性的自定义数据字段。

using System;
using System.Runtime.Serialization;
[Serializable]
public class CustomException : Exception {
  readonly Int32 data;
  public CustomException() { }
  public CustomException(Int32 data) : base(FormatMessage(data)) {
    this.data = data;
  }
  public CustomException(String message) : base(message) { }
  public CustomException(Int32 data, Exception inner)
    : base(FormatMessage(data), inner) {
    this.data = data;
  }
  public CustomException(String message, Exception inner) : base(message, inner) { }
  protected CustomException(SerializationInfo info, StreamingContext context)
    : base(info, context) {
    if (info == null)
      throw new ArgumentNullException("info");
    this.data = info.GetInt32("data");
  }
  public override void GetObjectData(SerializationInfo info,
    StreamingContext context) {
    if (info == null)
      throw new ArgumentNullException("info");
    info.AddValue("data", this.data);
    base.GetObjectData(info, context);
  }
  public Int32 Data { get { return this.data; } }
  static String FormatMessage(Int32 data) {
    return String.Format("Custom exception with data {0}.", data);
  }
}

消息告诉您问题的具体内容-未定义message

请尝试这个方法,它允许您在创建异常时提供用户消息:

public IncorrectTimeIdException(string message, int TypeID) : base(message)
{
}
// Usage:
throw new IncorrectTimeIdException("The time ID is incorrect", id);

或者,这会创建一个没有消息的异常:

public IncorrectTimeIdException(int TypeID)
{
}

或者最后,这会创建一个带有预定义消息的异常:

public IncorrectTimeIdException(int TypeID) : base("The time ID is incorrect")
{
}

如果您愿意,还可以在类上声明多个构造函数,这样您就可以提供一个使用预定义消息的构造函数,同时提供一个允许重写该消息的构造函数。

相关文章: