C# Обработка исключений
Исключение — это проблема, возникающая во время выполнения программы. Исключения в C# — это реакция на исключительные ситуации, возникающие во время выполнения, например попытка деления на ноль.
Исключения предоставляют способ передачи управления программой из одной части в другую. Обработка исключений C# основана на четырёх ключевых словах:try、catch、finallyиthrow。
- try: Блок try определяет блок кода, для которого будет активировано определённое исключение. За ним следует один или несколько блоков catch.
- catch: Программа перехватывает исключение через обработчик исключений. Ключевое слово catch указывает на перехват исключения.
- finally: Блок finally используется для выполнения заданных операторов независимо от того, было ли выброшено исключение. Например, если вы открываете файл, файл будет закрыт независимо от того, возникло исключение или нет.
- throw: Когда возникает проблема, программа выбрасывает исключение. Это делается с помощью ключевого слова throw.
Синтаксис
Предполагая, что блок вызовет исключение, метод использует ключевые слова try и catch для перехвата исключения. Код внутри блока try/catch является защищённым кодом, а синтаксис try/catch показан ниже:
{
// Оператор, вызвавший исключение
}
catch( ExceptionName e1 )
{
// Код обработки ошибок
}
catch( ExceptionName e2 )
{
// Код обработки ошибок
}
catch( ExceptionName eN )
{
// Код обработки ошибок
}
finally
{
// Оператор для выполнения
}
Вы можете перечислить несколько операторов catch для перехвата различных типов исключений, если блок try генерирует несколько исключений в разных ситуациях.
Классы исключений в C#
Исключения C# представляются с помощью классов. Классы исключений в C# в основном прямо или косвенно производны от классаSystem.Exception.System.ApplicationExceptionиSystem.SystemExceptionЭтот класс является классом исключения, производным от класса System.Exception.
System.ApplicationExceptionэтот класс поддерживает исключения, генерируемые приложениями. Поэтому исключения, определяемые программистом, должны все наследоваться от этого класса.
System.SystemExceptionЭтот класс является базовым классом для всех предопределенных системных исключений.
В следующей таблице перечислены некоторые предопределенные классы исключений, производные от класса System.SystemException:
| Класс исключения | Описание |
|---|---|
| System.IO.IOException | Обработка ошибок ввода-вывода. |
| System.IndexOutOfRangeException | Обрабатывает ошибки, возникающие, когда метод обращается к индексу массива за пределами допустимого диапазона. |
| System.ArrayTypeMismatchException | Обрабатывает ошибки, возникающие при несовпадении типов массивов. |
| System.NullReferenceException | Обрабатывает ошибки, возникающие при обращении к объекту null. |
| System.DivideByZeroException | Обработка ошибок, возникающих при делении на ноль. |
| System.InvalidCastException | Обрабатывает ошибки, возникающие при преобразовании типов. |
| System.OutOfMemoryException | Обработка ошибок, вызванных нехваткой свободной памяти. |
| System.StackOverflowException | Обработка ошибок, вызванных переполнением стека. |
Обработка исключений
C# предоставляет структурированную схему обработки исключений в виде блоков try и catch. С помощью этих блоков основные операторы программы отделяются от операторов обработки ошибок.
Эти блоки обработки ошибок реализуются с помощьюtry,、catchиfinally— ключевых слов. Далее приведён пример создания исключения при делении на ноль:
Пример
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();
}
}
}
Когда приведённый выше код компилируется и выполняется, он выдаёт следующий результат:
Exception caught: System.DivideByZeroException: Attempted to divide by zero. at ... Result: 0
Создание пользовательских исключений
Вы также можете определять собственные исключения. Пользовательские классы исключений наследуются отApplicationExceptionClass. Следующий пример демонстрирует это:
Пример
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
Выброшенный объект
Если исключение прямо или косвенно наследуется от классаSystem.Exception, то можно выбросить объект. Вы можете использовать оператор throw в блоке catch, чтобы выбросить текущий объект, как показано ниже:
Catch(Exception e)
{
...
Throw e
}
Другие расширения