Создание собственных исключений С#

Следующие примеры в моей книге С#, и я наткнулся на пример книги, который не работает в Visual Studio. Он занимается созданием собственных исключений, в частности, это означает, что вы не должны принимать квадратный корень из отрицательного числа. Но когда я создаю исключение NegativeNumberException с помощью "throw new", я получаю сообщение об ошибке: "Тип или имя пространства имен" NegativeNumberException "не удалось найти (вы не указали директиву использования или ссылку на сборку?)"

Как я могу создать свои собственные исключения, если это не так? Может быть, моя книга устарела? Здесь код:

class SquareRootTest
{
    static void Main(string[] args)
    {
        bool continueLoop = true;

        do
        {
            try
            {
                Console.Write("Enter a value to calculate the sqrt of: ");
                double inputValue = Convert.ToDouble(Console.ReadLine());
                double result = SquareRoot(inputValue);

                Console.WriteLine("The sqrt of {0} is {1:F6)\n", inputValue, result);
                continueLoop = false;
            }
            catch (FormatException formatException)
            {
                Console.WriteLine("\n" + formatException.Message);
                Console.WriteLine("Enter a double value, doofus.\n");
            }
            catch (NegativeNumberException negativeNumberException)
            {
                Console.WriteLine("\n" + negativeNumberException.Message);
                Console.WriteLine("Enter a non-negative value, doofus.\n");
            }
        } while (continueLoop);
    }//end main
    public static double SquareRoot(double value)
    {
        if (value < 0)
            throw new NegativeNumberException(
                "Square root of negative number not permitted.");
        else
            return Math.Sqrt(value);
    }
}

Ответы

Ответ 1

Exception - это просто класс, подобный многим другим классам в .Net. Есть, ИМХО, две сложные вещи с определенными пользователем исключениями:

  • Наследовать класс исключения из Exception, а не из устаревшего ApplicationException
  • Определяемое пользователем исключение должно содержать много конструкторов - 4 в типичном случае

Что-то вроде этого:

public class NegativeNumberException: Exception {
  /// <summary>
  /// Just create the exception
  /// </summary>
  public NegativeNumberException()
    : base() {
  }

  /// <summary>
  /// Create the exception with description
  /// </summary>
  /// <param name="message">Exception description</param>
  public NegativeNumberException(String message)
    : base(message) {
  }

  /// <summary>
  /// Create the exception with description and inner cause
  /// </summary>
  /// <param name="message">Exception description</param>
  /// <param name="innerException">Exception inner cause</param>
  public NegativeNumberException(String message, Exception innerException)
    : base(message, innerException) {
  }

  /// <summary>
  /// Create the exception from serialized data.
  /// Usual scenario is when exception is occured somewhere on the remote workstation
  /// and we have to re-create/re-throw the exception on the local machine
  /// </summary>
  /// <param name="info">Serialization info</param>
  /// <param name="context">Serialization context</param>
  protected NegativeNumberException(SerializationInfo info, StreamingContext context)
    : base(info, context) {
  }
}

Ответ 2

Все исключения - это типы, подобные любым другим, и если вы хотите определить особый тип исключения, вам действительно нужно сделать для него класс:

/* You could also use ArgumentException, etc. */
class NegativeNumberException : Exception {
    …
}

…

Ответ 3

Вам нужно объявить свой пользовательский класс Exception NegativeNumberException.

все пользовательские исключения являются дочерними классами исключения, поэтому выведите NegativeNumberException класс из Exception class

Из MSDN:

Если вы разрабатываете приложение, которое необходимо создать исключений, вам рекомендуется получать пользовательские исключения из Класс исключений. Первоначально предполагалось, что пользовательские исключения должен происходить из класса ApplicationException; однако на практике это не было найдено, чтобы добавить значительную ценность. Для большего информацию см. в разделе "Рекомендации по устранению исключений". ApplicationException использует HRESULT COR_E_APPLICATION, который имеет значение 0x80131600.

Попробуйте следующее:

 public class NegativeNumberException : Exception
        {         


           public NegativeNumberException():base()
            {


            }   

            public NegativeNumberException (string message): base(message)
            {


            }


        }

Ответ 4

Так как пользовательские исключения .NET 3.0 должны быть получены от Exception, а не ApplicationException, поэтому используйте это:

public class NegativeNumberException : Exception
{ 
    public NegativeNumberException():base() { } 
    public NegativeNumberException (string message): base(message) { }
}