Унаследованный класс Exception с пользовательским свойством Message - PullRequest
5 голосов
/ 19 апреля 2011
public class GroupWithSpecificOptionsNotFoundException : Exception
{
    public GroupWithSpecificOptionsNotFoundException(string place, Dictionary<string, string> options)
            : base(string.Format("Group with specific options not found, in ({0}), at ({1})", place, DateTime.Now.ToString()))
    {
        foreach (string key in options.Keys)
        {
            this.Message += string.Format("Option Name : ({0}) with Value : ({1}) not found in this group options set", key, options[key]);
        }

    }
}

Идея проста, я хочу включить объекты ключ / значение в исключение Message.Это действие не может быть выполнено ни в элементе base(), ни внутри конструктора («Сообщение доступно только для чтения»).

Я нашел решение, в котором статическая функция может выполнить свою задачу:

public class GroupWithSpecificOptionsNotFoundException : Exception
{
    public static string GenerateOptionValueString(Dictionary<string, string> options)
    {
        string msg = string.Empty;
        foreach (string key in options.Keys)
        {
            msg += string.Format("Option Name : ({0}) with Value : ({1}) not found in this group options set", key, options[key]);
        }
        return msg;
    }

    public GroupWithSpecificOptionsNotFoundException(string place, Dictionary<string, string> options)
            : base (string.Format("Group with specific options not found ({2}), in ({0}), at ({1})",
                    place, DateTime.Now.ToString(), GroupWithSpecificOptionsNotFoundException.GenerateOptionValueString(options)))
    {
    }
}

Но я не совсем доволен этим!Есть ли другие обходные пути для этого и подобных случаев?

1 Ответ

11 голосов
/ 19 апреля 2011

Общие рекомендации по написанию исключений гласят, что вы должны написать Исключение с 3 общими кодами. Например:

public class MyException : Exception
{
    public MyException()
    {
    }
    public MyException(string message) : base(message)
    {
    }
    public MyException(string message, Exception innerException) 
        : base(message, innerException)
    {
    }
}

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

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