Write-Error
не выдаст завершающую ошибку по умолчанию, но с ErrorActionPreference
будет установлено Stop
, как вы упомянули.Однако это изменяет исключение, выданное на ActionPreferenceStopException
, которое действительно наследует RuntimeException
Вы все еще можете поймать WriteErrorException
без предложения RuntimeException
, поскольку запись внутренней ошибки дляActionPreferenceStopException
содержит WriteErrorException
Вы можете понять, что я имею в виду, выполнив следующее:
Write-Error 'this is a test' -ErrorAction Stop
$error[0].ErrorRecord.Exception.GetType()
# IsPublic IsSerial Name BaseType
# -------- -------- ---- --------
# True True WriteErrorException System.SystemException
Но с предложением RuntimeException
оно будет поднято первым, потому что RuntimeException
является наиболее подходящим типом исключения.
Чтобы обойти это, вам нужно либо сгенерировать более конкретное исключение, либо проверить $_
в предложении RuntimeException
.Вот последнее
$script:ErrorActionPreference = 'Stop'
try {
# Some code here
}
catch [Microsoft.PowerShell.Commands.WriteErrorException] {
# Print error messages (without stacktrace)
Write-Host -ForegroundColor Red $_.Exception.Message
exit 1
}
catch [System.Management.Automation.RuntimeException] {
if ($_.Exception -is [Microsoft.PowerShell.Commands.WriteErrorException]) {
# Print error messages (without stacktrace)
Write-Host -ForegroundColor Red $_.Exception.Message
exit 1
}
# A thrown string
Write-Host -ForegroundColor Red $_.Exception.Message
Write-Host -ForegroundColor Red $_.ScriptStackTrace
exit 1
}
catch {
# Print proper exception message (including stack trace)
Write-Host -ForegroundColor Red "$($_.Exception.GetType().Name): $($_.Exception.Message)"
Write-Host -ForegroundColor Red $_.ScriptStackTrace
exit 1
}
Вы также можете добавить туда предложение ActionPreferenceStopException
и проверить для $_
.
Редактировать: На самом деле, если вы не на самом деле хотите использовать Write-Error
, вам было бы лучше просто вызвать исключение, похожее на то, как в C #.Поэтому вместо Write-Error
используйте:
throw [System.InvalidOperationException]::new('This is my message')