Странное поведение 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 не работает в методах класса, которые возвращают непустое значение

Другие вопросы по тегам