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

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

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

4b9b3361

Ответ 1

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

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

    MyException ();
    
    MyException (string message);
    
    MyException (string message, 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" или существующий тип незапечатанного исключения вместо. Не создавать новое исключение базового типа, если не существует значение, позволяющее создать обработчик захвата для всего класса исключения.

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

Ответ 2


Похоже, я начал немного битву за исключение. В зависимости от того, какое руководство 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 - Сериализуем классы исключений

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

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

Ответ 3

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

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

Чтобы бросить:

throw new SomeException();

Ответ 4

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

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

метательное:

throw new CustomException("Custom exception message");

Ответ 5

Из документов Microsoft .NET Core 3.0:

Чтобы определить собственный класс исключений:

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

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

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

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

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

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

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

    • Исключение (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:

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

Использование в try/catch:

try
{
   ...
}
catch (NotPrimeException e)
{
   Console.WriteLine( "{0} is not prime", e.NotAPrime );
}

Ответ 6

Вы можете определить свое собственное исключение.

Пользовательские классы исключений выводятся из класса ApplicationException.

Вы можете увидеть следующий код:

using System;
namespace UserDefinedException
{
   class TestTemperature
   {
      static void Main(string[] args)
      {
         Temperature temp = new Temperature();
         try
         {
            temp.showTemp();
         }
         catch(TempIsZeroException e)
         {
            Console.WriteLine("TempIsZeroException: {0}", e.Message);
         }
         Console.ReadKey();
      }
   }
}
public class TempIsZeroException: ApplicationException
{
   public TempIsZeroException(string message): base(message)
   {
   }
}
public class Temperature
{
   int temperature = 0;
   public void showTemp()
   {
      if(temperature == 0)
      {
         throw (new TempIsZeroException("Zero Temperature found"));
      }
      else
      {
         Console.WriteLine("Temperature: {0}", temperature);
      }
   }
}

и для исключения исключения,

Вы можете бросить объект, если он прямо или косвенно получен из класса System.Exception

Catch(Exception e)
{
   ...
   Throw e
}