создать новый тип исключения - PullRequest
2 голосов
/ 20 февраля 2012

Я хочу создать новый тип исключения, чтобы поймать его с указанием регистрации. Но я хочу передать значение int в ctor. Как это сделать? Я стараюсь:

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

но я получил ошибку во время компиляции.

Ответы [ 3 ]

2 голосов
/ 20 февраля 2012

Вот некоторый код, который вы можете использовать для создания пользовательского класса исключений, который несет некоторые дополнительные данные (в вашем случае идентификатор типа), а также следует всем «правилам» для создания пользовательских исключений.Вы можете переименовать класс исключения и довольно неописанное поле пользовательских данных по своему вкусу.

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 голосов
/ 20 февраля 2012
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 голос
/ 20 февраля 2012

В сообщении сообщается, в чем именно заключается проблема - 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")
{
}

Если выподобно тому, как вы можете также объявить несколько конструкторов в своем классе, так что вы можете предоставить конструктор, который использует предопределенное сообщение одновременно с предоставлением конструктора, который позволяет вам переопределить это сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...