Нет, начиная с v7, PowerShell, к сожалению, не предлагает Python-подобное предложение else
как часть оператора try
/ catch
.
Один из вариантов - поместить код, пойманный только если не, внизувашего try
блока , после команд, которые могут дать сбой - см. полезный ответ Зафера Балкана .
Если это нежелательно , я предлагаю следующееидиома как обходной путь :
# Make sure that even normally non-terminating errors trigger the
# `catch` block below.
# Note that the *first* error that occurs in the `try` block
# will jump to the `catch` block right away - subsequent commands won't execute.
$ErrorActionPreference = 'Stop'
# Save the count of errors currently recorded in the automatic $Errors collection.
$errCountBefore = $Error.Count
try {
invoke-WebRequest -URI 'http://flakywebsite.com/site1' -Method GET
invoke-WebRequest -URI 'http://flakywebsite.com/site2' -Method GET
invoke-WebRequest -URI 'http://flakywebsite.com/site3' -Method GET
}
catch {
# Write a custom error to the $Error collection, as the *first*
# (most recent) item.
# Note: If you want the error to also *display*, use `-ErrorAction Continue`.
Write-Error -ErrorAction SilentlyContinue "An error occurred in the try loop: $_"
}
if ($errCountBefore -eq $Error.Count) { # No errors occurred.
"This code will run only if there is NOT an error in the try block."
}
Примечание: Если вы не записываете ошибку в свой блок catch
, используйте пользовательскую переменную [bool]
, например $caught
, который вы установили на $true
в своем блоке catch
, а затем проверьте на if (-not $caught)
.
Что касается того, что вы пытались :
$Error.add("An error occurred in the try loop."}
Вы не должны писать напрямую в $Error
(что делает следующие пункты спорными: donдобавить строки ине добавлять к коллекции ошибок, которые она хранит) по следующим причинам:
$Error
- это так называемая автоматическая переменная в PowerShell, что обычно означает, что PowerShell само управляет им , и пользовательский код не должен изменять его напрямую.
Единственное исключениеЧто касается $Error
, то вы можете очистить набор ошибок, накопленных в сеансе на данный момент, используя $Error.Clear()
В противном случае PowerShell управляет $Error
какследует:
Любая ошибка автоматически регистрируется в $Error
, в обратном порядке в хронологическом порядке (самый последний - первый).
- Единственными исключениями являются команды, которые вызываются с
-ErrorAction Ignore
и выводом stderr из внешних программ .
$Error
содержит только error-объекты записи (экземпляры типа System.Management.Automation.ErrorRecord
), которые предоставляют структурированную подробную информацию о each error.
Следовательно, весь ваш код, необходимый для записи ошибок в $Error
, должен либо записать ошибку в поток ошибок с помощью Write-Error
,или выдать ошибку завершения сценария с помощью оператора Throw
- PowerShell обернет каждую ошибку в экземпляр System.Management.Automation.ErrorRecord
, если необходимо, и добавит $Error
в обратном хронологическом порядке.