Подтвердить что ты не робот

Установка сообщения пользовательского Исключения без передачи его базовому конструктору

Я хочу создать пользовательский Exception в С#, но теоретически мне нужно немного разобрать синтаксический анализ, прежде чем я смогу сделать читаемый пользователем ExceptionMessage.

Проблема заключается в том, что исходное сообщение может быть установлено только путем вызова базового конструктора Messsage, поэтому я не могу выполнять синтаксический анализ заранее.

Я попытался перегрузить свойство Message следующим образом:

public class CustomException : Exception
{
    string _Message;

    public CustomException(dynamic json) : base("Plep")
    {
        // Some parsing to create a human readable message (simplified)
        _Message    = json.message;
    }

    public override string Message
    {
        get { return _Message; }
    }
}

Проблема в том, что отладчик Visual Studio по-прежнему показывает сообщение, которое я передал в конструктор, Plep в этом случае.

throw new CustomException( new { message="Show this message" } )

приводит к:

Visual Studio Exception Dialog

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

Необработанное исключение типа "App.CustomException" произошло в App.exe

Вопрос

Похоже, что в диалоговом окне Exception читается какое-либо поле/свойство, в котором у меня тоже нет доступа. Есть ли другой способ установить человеческое читаемое сообщение об ошибке вне базового конструктора в Exception.

Обратите внимание, что я использую Visual Studio 2012.

4b9b3361

Ответ 1

Просто введите код форматирования в статический метод?

public CustomException(dynamic json) : base(HumanReadable(json)) {}
private static string HumanReadable(dynamic json) {
    return whatever you need to;
}

Ответ 2

Рассмотрим рекомендации Microsoft по созданию новых исключений:

  using System;
  using System.Runtime.Serialization;

  [Serializable]
  public class CustomException : Exception
  {
    //
    // For guidelines regarding the creation of new exception types, see
    //    https://msdn.microsoft.com/en-us/library/ms229064(v=vs.100).aspx
    //

    public CustomException()
    {
    }

    public CustomException(string message) : base(message)
    {
    }

    public CustomException(string message, Exception inner) : base(message, inner)
    {
    }

    protected CustomException(SerializationInfo info, StreamingContext context) : base(info, context)
    {
    }

    public static CustomException FromJson(dynamic json)
    {
      string text = ""; // parse from json here

      return new CustomException(text);
    }
  }

Обратите внимание на статический метод factory (не часть шаблона), который вы можете использовать в своей программе следующим образом:

throw CustomException.FromJson(variable);

Таким образом, вы следовали лучшей практике и можете анализировать свой json внутри класса исключений.

Ответ 3

Я думаю, проблема может быть в отладчике Visual Studio. Я получил точные результаты, которые вы получили с помощью отладчика, но когда я печатаю сообщение вместо этого:

class CustomException : Exception {
    public CustomException(dynamic json)
        : base("Plep") {
            _Message = json.message;
    }

    public override string Message {
        get { return _Message; }
    }

    private string _Message;
}

class Program {
    static void Main(string[] args) {
        try {
            throw new CustomException(new { message = "Show this message" });
        } catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }
    }
}

Я получаю ожидаемый "Show this message".

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

Ответ 4

Мне нравится использовать это здесь. Это просто и не нуждается в статической функции:

public class MyException : Exception
{
    public MyException () : base("This is my Custom Exception Message")
    {
    }
}

Ответ 5

Что не так с чем-то вроде этого.

    public class FolderNotEmptyException : Exception
{

    public FolderNotEmptyException(string Path) : base($"Directory is not empty. '{Path}'.")
    { }

    public FolderNotEmptyException(string Path, Exception InnerException) : base($"Directory is not empty. '{Path}'.", InnerException)
    { }

}

Я просто использую строку и включаю параметры. Простое решение