Странное поведение Write-Error (PowerShell): нет вывода изнутри методов с возвращаемым значением - PullRequest
1 голос
/ 23 января 2020

Вывод 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 Ответ

1 голос
/ 23 января 2020

В настоящее время для этого открыта ошибка. Проблема на самом деле в том, что 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

Reference

Github -Write-Error не работает в методах класса, которые возвращают непустое значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...