Исключением является проблема, которая возникает во время выполнения программы. Исключения C# являются ответом на исключительные обстоятельства, которые возникают при выполнении программы, такие как например попытка деления на ноль.
Исключения предоставляют способ для передачи управления от одной части программы в другую. Исключения C# созданы на четырех ключевых словах: try, catch, finally и throw.
Если предположить, что блок будет содержать исключение, метод перехватывает исключение с использованием комбинации ключевых слов try и catch. Блок try/catch размещается вокруг кода, который может генерировать исключение. Код внутри блока try/catch называется защищенный код, и синтаксис для использования try/catch выглядит следующим образом:
try
{
// выражения вызывающие исключения
}
catch( ExceptionName e1 )
{
// код обработки ошибок
}
catch( ExceptionName e2 )
{
// код обработки ошибок
}
catch( ExceptionName eN )
{
// код обработки ошибок
}
finally
{
// выражение
}
Вы можете перечислить несколько выражений catch для разных типов исключений в случае, если ваш блок try пробует более одного выражения в различных ситуациях.
Исключения C# представлены классами. Классы исключений в C# в основном, прямо или косвенно, полученны из класса System.Exception. Некоторые из классов исключений являются производными от класса System.Exception, такие как классы System.ApplicationException и System.SystemException.
Класс System.ApplicationException поддерживает исключения созданные прикладными программами. Так исключения определяемые программистами являются производными от этого класса.
Класс System.SystemException является базовым классом для всех предопределенных исключений системы.
В следующей таблице приведены некоторые из предопределенных классов исключений, полученных из класса Sytem.SystemException:
Класс исключений | Описание |
---|---|
System.IO.IOException | Обрабатывает ошибки ввода/вывода. |
System.IndexOutOfRangeException | Обрабатывает ошибки, генерируемые, когда метод ссылается на массив индекса вне диапазона. |
System.ArrayTypeMismatchException | Обрабатывает ошибки, генерируемые при обнаружении несоответствия типа с типом массива. |
System.NullReferenceException | Обрабатывает ошибки, генерируемые при попытке разыменования указателя NULL на объект. |
System.DivideByZeroException | Обрабатывает ошибки, генерируемые при делении на ноль. |
System.InvalidCastException | Обрабатывает ошибки, генерируемые при недопустимом приведении или явном преобразовании типов. |
System.OutOfMemoryException | Обрабатывает ошибки, генерируемые при недостаточной свободной памяти. |
System.StackOverflowException | Обрабатывает ошибки, генерируемые при переполнении стека. |
C# обеспечивает структурированное решение проблемы обработки исключений в виде блоков try и catch. Ниже приведен пример создания исключения при делении на ноль:
using System;
namespace ErrorHandlingApplication
{
class DivNumbers
{
int result;
DivNumbers()
{
result = 0;
}
public void division(int num1, int num2)
{
try
{
result = num1 / num2;
}
catch (DivideByZeroException e)
{
Console.WriteLine("Исключение: {0}", e);
}
finally
{
Console.WriteLine("Результат: {0}", result);
}
}
static void Main(string[] args)
{
DivNumbers d = new DivNumbers();
d.division(25, 0);
Console.ReadKey();
}
}
}
Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:
Исключение: System.DivideByZeroException: Attempted to divide by zero.
at ...
Результат: 0
Вы можете также определить ваши собственные исключения. Класс пользовательских исключений является производным от класса 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);
}
}
}
Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:
TempIsZeroException: Zero Temperature found