Ответ 1
Просто введите код форматирования в статический метод?
public CustomException(dynamic json) : base(HumanReadable(json)) {}
private static string HumanReadable(dynamic json) {
return whatever you need to;
}
Я хочу создать пользовательский 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" } )
приводит к:
Если я оставил базовый конструктор пустым, он покажет очень общее сообщение:
Необработанное исключение типа "App.CustomException" произошло в App.exe
Вопрос
Похоже, что в диалоговом окне Exception читается какое-либо поле/свойство, в котором у меня тоже нет доступа. Есть ли другой способ установить человеческое читаемое сообщение об ошибке вне базового конструктора в Exception.
Обратите внимание, что я использую Visual Studio 2012.
Просто введите код форматирования в статический метод?
public CustomException(dynamic json) : base(HumanReadable(json)) {}
private static string HumanReadable(dynamic json) {
return whatever you need to;
}
Рассмотрим рекомендации 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 внутри класса исключений.
Я думаю, проблема может быть в отладчике 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"
.
Если вы поставили точку останова, где исключение было обнаружено, отладчик действительно показывает вам правильное сообщение.
Мне нравится использовать это здесь. Это просто и не нуждается в статической функции:
public class MyException : Exception
{
public MyException () : base("This is my Custom Exception Message")
{
}
}
Что не так с чем-то вроде этого.
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)
{ }
}
Я просто использую строку и включаю параметры. Простое решение