创建新的异常类型

时间:2012-02-20 12:55:55

标签: c# exception

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

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

但是我在编译期间出错了。

3 个答案:

答案 0 :(得分:2)

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")
    {
    }
}

答案 1 :(得分:2)

以下是一些代码,您可以使用这些代码创建一个自定义异常类,其中包含一些附加数据(在您的情况下为类型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);
  }

}

答案 2 :(得分:1)

该消息确切地告诉您问题所在 - 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")
{
}

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