Каковы лучшие отраслевые стандарты для реализации пользовательских исключений в C #? - PullRequest
62 голосов
/ 25 января 2011

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

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

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

Ответы [ 4 ]

67 голосов
/ 25 января 2011

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

Вот базовый пример пользовательского 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 на более высоком уровне (если применимо)

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

9 голосов
/ 14 августа 2012

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

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

8 голосов
/ 25 января 2011

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

http://msdn.microsoft.com/en-us/library/ms229014.aspx // дает общее представление об исключениях, включая пользовательские исключения

http://blogs.msdn.com/b/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx //

1 голос
/ 07 августа 2013

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

Например, мне нравится использовать платформу 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) {}
}

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

Грег

...