В C # как мне определить мои собственные исключения? - PullRequest
55 голосов
/ 04 февраля 2010

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

Ответы [ 5 ]

66 голосов
/ 04 февраля 2010

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

  • убедитесь, что класс сериализуем, добавив атрибут [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 относительно этого правила.

38 голосов
/ 04 февраля 2010
<ч />

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

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

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

12 голосов
/ 04 февраля 2010

Определить:

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

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

throw new SomeException();
3 голосов
/ 04 февраля 2010

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

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

метания:

throw new CustomException("Custom exception message");
0 голосов
/ 06 декабря 2013

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

Определяемые пользователем классы исключений являются производными от 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 class

Catch(Exception e)
{
   ...
   Throw e
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...