# Обработка исключений

## Вызов исключений

* Команда **throw "Bad thing happened"** создает исключение и прерывает выполнение скрипта.
* Командлет **Write-Error -Message "Houston, we have a problem." -ErrorAction Stop** выводит ошибку, а установка **ErrorAction** в **Stop**, заставляет скрипт остановиться с этой ошибкой.

## Обработка исключений

Принцип обработки ошибок в PowerShell основан на конструкции:

```powershell
try {
  # код, в котором может произойти ошибка
}
catch {
  # код для обработки ошибки
}
finally {
  # код, который выполняется всегда после try/catch
}
```

* Код в блоке `try` выполняется первым.
* Если во время выполнения `try` возникает неустранимая ошибка, управление передается блоку `catch`. В случае отсутствия ошибок блок `catch` пропускается.
* В блоке `catch` доступна автоматическая переменная `$PSItem` (или `$_`) типа `ErrorRecord`, которая содержит детали исключения.
* Блок `finally` выполняется всегда, независимо от того, возникла ошибка или нет. Он используется, чтобы гарантировать выполнение важного кода, например, закрытие соединений или освобождение ресурсов.
* Можно использовать одновременно и `catch`, и `finally`. Это позволяет обрабатывать ошибки и при этом всегда выполнять завершающие действия, независимо от результата.

Пример:

```powershell
try {
  throw "Bad thing happened"
}
catch {
  Write-Host "Ошибка: $($_.Exception.Message)" -ForegroundColor Red
}
finally {
  Write-Host "Этот блок выполнится всегда"
}
```

В данном примере исключение вызывается через `throw`, затем перехватывается в `catch`, где выводится сообщение об ошибке, и потом происходит выполнение `finally`, где можно разместить завершающий код.

Эта модель упрощает написание надежных скриптов с управлением ошибками и очисткой ресурсов.

Такой подход к исключениям помогает создавать более устойчивые и удобные для сопровождения PowerShell скрипты, минимизируя неожиданные прерывания и обеспечивая своевременную реакцию на ошибки.

С дополнительной информацией можно ознакомиться по ссылке:

{% embed url="<https://docs.microsoft.com/ru-ru/powershell/scripting/learn/deep-dives/everything-about-exceptions?view=powershell-7.1>" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.sherparpa.ru/sherpa-rpa/sherpa-designer/sherpa-designer-otvety-na-chasto-zadavaemye-voprosy/powershell/obrabotka-isklyuchenii.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
