Создание собственных исключений С#
Следующие примеры в моей книге С#, и я наткнулся на пример книги, который не работает в 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) { }
}