PowerShell:
Запись в стандартный поток ошибок
Как это сделать:
# Запишем простую ошибку в stderr
Write-Host "Упс, произошла ошибка!" -ForegroundColor Red 1>&2
# Запишем ошибку, используя командлет Write-Error
Write-Error "Это сообщение об ошибке!"
# Использование $ErrorView для отображения или обработки ошибок по-разному
$ErrorView = "CategoryView"
try {
Get-ChildItem "nonexistentfile.txt"
} catch {
Write-Host $_.Exception.Message -ForegroundColor Red 1>&2
}
Пример вывода:
Упс, произошла ошибка!
Write-Error: Это сообщение об ошибке!
Get-ChildItem: Не удается найти путь 'C:\...\nonexistentfile.txt', потому что он не существует.
Погружение в детали
Исторически, разделение stdout и stderr имеет корни Unix, позволяя пользователям перенаправлять выводы отдельно. PowerShell, унаследовавший эту концепцию, использует Write-Error и Write-Host (с перенаправлением), среди прочих командлетов, для отправки сообщений в stderr. Под капотом PowerShell использует методы .NET для реализации этой возможности.
Альтернативы включают использование операторов throw или блоков обработки исключений; однако, они влияют на поток скрипта. Запись в stderr не прерывает выполнение, если вы специально не проверите переменную $Error или не используете параметры -ErrorAction.