2013-12-05 4 views
17

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

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

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); 
    } 
} 
+3

Необходимо создать класс «NegativeNumberException», который будет получен из System.Exception. Вы не можете просто помещать имена классов там, чтобы создавать вещи. –

ответ

45

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

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

Нечто подобное:

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) { 
    } 
} 
+0

По какой-то причине мне пришлось изменить каждый тип 'String' на' string' или я получил ошибку: '' String ': статические типы не могут использоваться как параметры'. –

+2

@ kill4silence: добавить 'using System;' поскольку '' String' в * псевдониме * 'string' определен в пространстве имен' System'. –

5

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

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

… 
+0

[Обычно рекомендуется выводить любые настраиваемые типы исключений из «Исключения» и специально избегать «ApplicationException») (http://msdn.microsoft.com/en-us/library/seyhszts (v = vs.110). aspx), но в этом случае я не знаю, почему вы не просто выбросили из коробки 'ArgumentException'. –

+0

@PrestonGuillot: Да, спасибо. Эти лучшие практики, всегда меняющиеся ... – Ryan

1

You необходимо объявить свой собственный класс исключений NegativeNumberException.

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

Из MSDN:

If you are designing an application that needs to create its own exceptions, you are advised to derive custom exceptions from the Exception class. It was originally thought that custom exceptions should derive from the ApplicationException class; however in practice this has not been found to add significant value. For more information, see Best Practices for Handling Exceptions. ApplicationException uses the HRESULT COR_E_APPLICATION, which has the value 0x80131600.

Попробуйте:

public class NegativeNumberException : Exception 
     {   


      public NegativeNumberException():base() 
      { 


      } 

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


      } 


     } 
1

С .NET 3.0 пользовательских исключений should be derived от Exception, а не ApplicationException, поэтому используйте это:

public class NegativeNumberException : Exception 
{ 
    public NegativeNumberException():base() { } 
    public NegativeNumberException (string message): base(message) { } 
} 
Смежные вопросы