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

Каковы лучшие отраслевые стандарты для реализации пользовательских исключений в С#?

Каковы наилучшие отраслевые стандарты для реализации пользовательских исключений в С#?

Я проверил Google и там большое количество рекомендаций, однако я не знаю, какие из них обладают большей достоверностью.

Если у кого-нибудь есть ссылки на авторитетные статьи, это также будет полезно.

4b9b3361

Ответ 1

Стандартом для создания пользовательских исключений является вывод Exception. Затем вы можете ввести свои собственные свойства/методы и перегруженные конструкторы (если применимо).

Вот базовый пример пользовательского ConnectionFailedException, который принимает дополнительный параметр, специфичный для типа исключения.

[Serializable]
public class ConnectionFailedException : Exception
{
    public ConnectionFailedException(string message, string connectionString)
        : base(message)
    {
        ConnectionString = connectionString;
    }

    public string ConnectionString { get; private set; }
}

В приложении это можно использовать в сценариях, где приложение пытается подключиться к базе данных, например.

try
{
    ConnectToDb(AConnString);
}
catch (Exception ex)
{
    throw new ConnectionFailedException(ex.Message, AConnString);
}

Вам нужно обработать ConnectionFailedException на более высоком уровне (если применимо)

Также посмотрите Конструирование пользовательских исключений и Пользовательские исключения

Ответ 3

Вот код для создания настраиваемого исключения:

using System;
using System.Runtime.Serialization;

namespace YourNamespaceHere
{
    [Serializable()]
    public class YourCustomException : Exception, ISerializable
    {
        public YourCustomException() : base() { }
        public YourCustomException(string message) : base(message) { }
        public YourCustomException(string message, System.Exception inner) : base(message, inner) { }
        public YourCustomException(SerializationInfo info, StreamingContext context) : base(info, context) { }
    }
}

Смотрите также: http://www.capprime.com/software_development_weblog/2005/06/16/CreatingACustomExceptionClassInC.aspx

Ответ 4

Я использую пользовательские исключения, чтобы сообщить о характере ошибки.

Например, мне нравится использовать фреймворк, предоставленный "ArgumentNullException" для проверки аргументов. Затем, когда я вижу эту ошибку либо в отладчике, либо в журнале ошибок, я сразу узнаю природу ошибки, не читая ее дальше.

Другим концом спектра является исключение InvalidOperationException, которое может означать почти что угодно.

Альтернативой пользовательским исключениям являются подробные сообщения об ошибках. Это нормально, но при создании специального исключения, такого как ConnectionFailed, более значимо. Тогда само сообщение может предоставить более подробные сведения.

При создании таких пользовательских исключений я не добавляю никаких новых свойств. Причина этого в том, что если у вас есть регистратор ошибок, вы хотите, чтобы он работал во всех исключениях. Если вы добавите специальное свойство, тогда регистратор ошибок будет игнорировать его. Например, если вы используете MSTest, при запуске теста и сбое пользовательские свойства не отображаются. Но если вы придерживаетесь свойства Message для базового слоя, оно будет отображаться просто отлично.

Итак, подклассификация очень проста:

public class NavigationException : Exception{
    public NavigationException() {}
    public NavigationException(string msg) : base(msg) {}
    public NavigationException(string msg, Exception inner) : base(msg, inner) {}
}

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

Грег