Странное поведение Write-Error (PowerShell): нет вывода из методов с возвращаемым значением
Вывод Write-Error опускается в методах, которые имеют возвращаемое значение (т.е. не являются недействительными):
Class MyClass {
[void]MethodWithoutReturnValue([string]$Msg) {
Write-Error "MyClass.MethodWithoutReturnValue(): $Msg"
}
[bool]MethodWithReturnValue([string]$Msg) {
Write-Error "MyClass.MethodWithReturnValue(): $Msg"
$this.MethodWithoutReturnValue("this won't work either")
return $true
}
}
[MyClass]$obj = [MyClass]::new()
$obj.MethodWithoutReturnValue('this error will show up')
[bool]$Result = $obj.MethodWithReturnValue('this error will NOT show up')
Я ожидаю трех сообщений об ошибках, но получаю только одно. Обратите внимание, что вызов метода void из метода bool также пропускает вывод, как если бы стек вызовов каким-то образом "отравлен". И да (хотя это не показано в этом примере) метод void, вызывающий метод void, работает.
Может кто-нибудь объяснить это поведение, или я только что нашел ошибку?
1 ответ
В настоящее время для этого есть ошибка. Проблема в том, чтоWrite-Error
работать в пустом методе.
По замыслу, вы должны использовать Throw
произвести ошибку внутри класса.
Вот модифицированная версия вашего скрипта
Class MyClass {
[void]MethodWithoutReturnValue([string]$Msg) {
Throw "MyClass.MethodWithoutReturnValue(): $Msg"
}
[bool]MethodWithReturnValue([string]$Msg) {
Throw "MyClass.MethodWithReturnValue(): $Msg"
$this.MethodWithoutReturnValue("this won't work either")
return $true
}
}
[MyClass]$obj = [MyClass]::new()
$obj.MethodWithoutReturnValue('this error will show up')
[bool]$Result = $obj.MethodWithReturnValue('this error will NOT show up')
Дополнительное примечание
С помощью Throw
остановит ваш скрипт, чтобы скрипт не продолжил работу. Чтобы этого не произошло, используйтеTry{}Catch{}
заявление.
[MyClass]$obj = [MyClass]::new()
Try {
$obj.MethodWithoutReturnValue('this error will show up')
}
Catch {
Write-Error $_
}
[bool]$Result = $obj.MethodWithReturnValue('this error will NOT show up')
# I love Cyan
Write-Host 'Second error not being in a try catch mean this will not get printed' -ForegroundColor Cyan
Справка
Github -Write-Error не работает в методах класса, которые возвращают непустое значение