---
title: Обработка исключений
seo:
  title: "Обработка исключений — С# Developer"
  description: "Тема «Обработка исключений» для собеседования С# Developer. Что такое Exception? Для чего служат try, catch, finally? В каком случае может не выполниться блок finally?"
---

[Все темы С# Developer](/s-developer)

## <strong>Что такое</strong> <code>Exception</code><strong>?</strong> [#q-14bee738d69b81dcb4aefa2bf51d77c2]

Исключение — это любое состояние ошибки или непредвиденное поведение, возникающее при выполнении программы. В .NET исключение — это объект, наследуемый от класса <code>System&#46;Exception</code>. Исключение создается из области кода, где произошла проблема. Оно передаётся вверх по стеку до тех пор, пока его не обработает приложение либо программа не завершится.

:::note[Ссылки для изучения]

1. [Обработка исключений в .NET](https://learn.microsoft.com/ru-ru/dotnet/standard/exceptions/)
   :::

---

## <strong>Для чего служат</strong> <code>try</code><strong>,</strong> <code>catch</code><strong>,</strong> <code>finally</code><strong>? В каком случае может не выполниться блок</strong> <code>finally</code><strong>?</strong> [#q-14bee738d69b81bdb2a6d91394dc18aa]

Конструкция <code>try&#46;&#46;&#46;catch&#46;&#46;&#46;finally</code> предназначена для обработки исключений. При использовании блока <code>try&#46;&#46;&#46;catch&#46;&#46;&#46;finally</code> происходит следующее&#58;

{/* prettier-ignore */}
1. <strong>Выполнение блока try</strong>&#58;

    - Все инструкции в блоке <code>try</code> выполняются.

1. <strong>Блок try завершен без исключений</strong>&#58;

    - Если в блоке <code>try</code> не возникло исключений, то после его выполнения начинает выполняться блок <code>finally</code>.

1. <strong>Исключение в блоке try</strong>&#58;

    - Если в блоке <code>try</code> возникает исключение, то обычный порядок выполнения останавливается, и среда CLR начинает искать блок <code>catch</code>, который может обработать данное исключение.

1. <strong>Обработка исключения блоком catch</strong>&#58;

    - Если нужный блок <code>catch</code> найден, то он выполняется, и после его завершения выполняется блок <code>finally</code>.

1. <strong>Исключение не обработано</strong>&#58;

    - Если нужный блок <code>catch</code> не найден, то при возникновении исключения программа аварийно завершает свое выполнение.

#### Пример&#58;

```csharp
try {
    // Код, который может вызвать исключение
}
catch (Exception ex) {
    // Обработка исключения
}
finally {
    // Код, который выполняется всегда
}
```

- <strong>try</strong>&#58; Содержит код, который может вызвать исключение.

- <strong>catch</strong>&#58; Содержит код для обработки исключения.

- finally выполняется при обычном выходе из try, включая return и раскрутку стека при исключении. Это не абсолютная гарантия&#58; блок может не выполниться при Environment.FailFast, принудительном завершении процесса или если выполнение не выходит из try.

:::note[Ссылки для изучения]

1. [Операторы обработки исключений в .NET](https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/statements/exception-handling-statements)
   :::

---

## <strong>Что такое</strong> <code>call stack</code><strong>? Какие ключевые слова вы знаете?</strong> [#q-14bee738d69b81aca4a4c2bcd61b7307]

Стек вызовов хранит цепочку активных вызовов методов. Окно Call Stack отладчика показывает эту цепочку; это представление стека, а не его определение. Для работы с исключениями используются try, catch, finally и throw.

:::note[Ссылки для изучения]

1. [Что такое call stack?](https://qna.habr.com/q/384837)
   :::
