В C#, как я определяю свои собственные Исключения?

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

var ps = new Date('2010-04-02T14:12:07')  ;
ps = ps.toDateString() + " " + ps.getHours() + ":"+ ps.getMinutes() + " hrs";

Выход:

Fri Apr 02 2010 19:42 hrs
55
задан David Basarab 4 February 2010 в 04:21
поделиться

5 ответов

От Microsoft .NET Core 3,0 документа :

Для определения собственного класса исключений:

  1. Определяют класс, который наследовался Исключению. При необходимости определите любых уникальных участников, необходимых Вашему классу для предоставления дополнительной информации об исключении. Например, класс ArgumentException включает свойство ParamName, которое указывает название параметра, аргумент которого вызвал исключение, и свойство RegexMatchTimeoutException включает свойство MatchTimeout, которое указывает на интервал тайм-аута.

  2. При необходимости, переопределите любых наследованных участников, функциональность которых Вы хотите изменить или изменить. Обратите внимание, что большинство существующих производных классов Исключения не переопределяет поведение наследованных участников.

  3. Определяют, является ли Ваш пользовательский объект исключения сериализуемым. Сериализация позволяет Вам сохранить информацию об исключении и разрешает информации об исключении быть совместно использованной сервером и клиентским прокси в контексте дистанционной работы. Для создания объекта исключения сериализуемым отметьте его с атрибутом SerializableAttribute.

  4. Определяют конструкторов Вашего класса исключений. Как правило, классы исключений имеют один или несколько следующих конструкторов:

    • Исключение (), который использует значения по умолчанию для инициализации свойств нового объекта исключения.

    • Исключение (Строка), которая инициализирует новый объект исключения с указанным сообщением об ошибке.

    • Исключение (Строка, Исключение), который инициализирует новый объект исключения с указанным сообщением об ошибке и внутренним исключением.

    • Исключение (SerializationInfo, StreamingContext), который является защищенным конструктором, который инициализирует новый объект исключения от сериализированных данных. Необходимо реализовать этого конструктора, если Вы приняли решение сделать свой объект исключения сериализуемым.

Пример:

using System;
using System.Runtime.Serialization;

[Serializable()]
public class NotPrimeException : Exception
{
   private int _notAPrime;
   public int NotAPrime { get { return _notAPrime; } }

   protected NotPrimeException() : base()
   { }

   public NotPrimeException(int value) : base(String.Format("{0} is not a prime number.", value))
   {
      _notAPrime = value;
   }

   public NotPrimeException(int value, string message) : base(message)
   {
      _notAPrime = value;
   }

   public NotPrimeException(int value, string message, Exception innerException) : base(message, innerException)
   {
      _notAPrime = value;
   }

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

Использование в броске:

throw new NotPrimeException(prime, "This is not a prime number."));

Использование в попытке/выгоде:

try
{
   ...
}
catch (NotPrimeException e)
{
   Console.WriteLine( "{0} is not prime", e.NotAPrime );
}
0
ответ дан 7 November 2019 в 07:13
поделиться

Рекомендации по созданию вашего собственного исключения (рядом с тем фактом, что ваш класс должен наследовать от исключения)

  • убедитесь, что класс сериализуемый, путем добавления атрибута [Serializable]
  • предоставляют общие конструкторы, которые используются исключениями:

     MyException (); 
     
    MyException (строковое сообщение) ; 
     
    MyException (строковое сообщение, Exception innerException); 
     

Итак, в идеале ваше пользовательское Exception должно выглядеть как минимум так:

[Serializable]
public class MyException : Exception
{
    public MyException ()
    {}

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

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

О том, должны ли вы наследовать от Exception или ApplicationException : FxCop имеет правило, согласно которому вам следует избегать наследования от ApplicationException :

CA1058: Microsoft.Design:
Измените базовый тип MyException, чтобы он больше не расширял ApplicationException. Этот базовый тип исключения не предоставляет никакого дополнительного значения для классов фреймворка. Вместо этого расширьте 'System.Exception' или существующий незапечатанный тип исключения . Не создавайте новый базовый тип исключения , если не указано конкретное значение в разрешении создания обработчика catch для всего класса исключений .

См. страницу в MSDN относительно этого правила.

68
ответ дан 7 November 2019 в 07:13
поделиться

Чтобы определить:

public class SomeException : Exception
{
    // Add your own constructors and properties here.
}

Выбросить:

throw new SomeException();
13
ответ дан 7 November 2019 в 07:13
поделиться

Определение:

public class CustomException : Exception
{
   public CustomException(string Message) : base (Message)
   {
   }
}

бросание:

throw new CustomException("Custom exception message");
3
ответ дан 7 November 2019 в 07:13
поделиться

Похоже, что Я начал битву за подклассы исключений. В зависимости от руководства Microsoft Best Practices, которому вы следуете ... вы можете унаследовать от System.Exception или System.ApplicationException. Есть хороший (но старый) пост в блоге, который пытается прояснить путаницу. Я пока сохраню свой пример с Exception, но вы можете прочитать сообщение и выбрать в зависимости от того, что вам нужно:

http://weblogs.asp.net/erobillard/archive/2004/05/10/129134. aspx

Битвы больше нет! Спасибо Фредерику за указание правила FxCop CA1058, в котором говорится, что ваши исключения должны наследоваться от System.Exception, а не от System.ApplicationException:

CA1058: Типы не должны расширять определенные базовые типы


Определите новый класс, который наследуется от Exception ( Я включил несколько конструкторов ... но вам не обязательно их иметь):

using System;
using System.Runtime.Serialization;

[Serializable]
public class MyException : Exception
{
    // Constructors
    public MyException(string message) 
        : base(message) 
    { }

    // Ensure Exception is Serializable
    protected MyException(SerializationInfo info, StreamingContext ctxt) 
        : base(info, ctxt)
    { }
}

И в другом месте вашего кода, которое нужно выбросить:

throw new MyException("My message here!");

EDIT

Обновлено с изменениями, чтобы гарантировать сериализуемое исключение. Подробности можно найти здесь:

Архив блога Winterdom - Сделайте классы исключений сериализуемыми

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

Спасибо Игорю за то, что позвонил мне!

38
ответ дан 7 November 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: