Powershell类中try/catch的输出

Powershell类中try/catch的输出,powershell,class,try-catch,Powershell,Class,Try Catch,在powershell中尝试使用类时,我不确定如何显示输出。例如,在此代码块中,写入错误不会显示错误消息: class Test { [string] $test Test ([string] $test) { $this.test = $test } [test] Testfail() { try { Get-Childitem F:\ -ErrorAction stop } catch

在powershell中尝试使用类时,我不确定如何显示输出。例如,在此代码块中,写入错误不会显示错误消息:

class Test {
[string] $test 

    Test ([string] $test) {
        $this.test = $test
    }

    [test] Testfail() {
        try {
            Get-Childitem F:\ -ErrorAction stop

        } catch  {

            Write-Host  "ERROR!!! $this.test"
            Exit 1

        }
        return $this.test + "not an error!"
    }
}

在这种情况下,很明显,当powershell窗口退出时,代码会运行catch语句,但如果我对退出1进行注释,则不会显示Write Host消息。有人能解释如何输出错误吗?

只能使用
exit
退出脚本文件(
*.ps1
),而不是类方法或函数。

从类方法或函数调用
exit
,将立即作为一个整体退出PowerShell进程

若要报告类方法的错误,请使用终止错误,这是
-ErrorAction Stop
Throw
语句生成的错误

也就是说,只需使用
Get Childitem F:\-ErrorAction stop
而不使用
try
/
catch
,这会导致调用方必须捕获的(线程)终止错误。

相反,如果您只是想在方法中发出错误消息,而不影响执行流程,请注意,您不能从类方法中使用
写入错误
;但是,您可以使用
写入警告
写入主机
也可以,但不建议使用)

  • 警告您不能盲目使用
    返回
    退出方法
    ,除非它是
    [void]
    -键入的。您必须返回声明的返回类型的实例,而
    return$null
    可以很好地表示引用类型的“无返回值”,使用
    return$null
    和值类型,例如
    [int]
    [datetime]
    $null
    转换为该类型(导致返回类型
    [int]
    0
    )或中断(返回类型
    [datetime]
    ,因为
    $null
    无法有意义地转换为该类型)

简而言之:PowerShell中的类方法的行为与其他PowerShell代码不同

  • 要写入成功输出流,必须使用
    return
    语句;不支持隐式输出

  • 若要报告错误,必须通过公共参数
    -ErrorAction Stop
    Throw
    语句或调用生成异常的.NET方法生成终止错误;非终止错误和尝试直接使用
    write error
    写入错误流的行为将被忽略

  • 但是,所有其他输出流(请参阅)都是通过的


在中讨论了这一可能令人惊讶的差异,在中可以找到澄清文档中行为的请求。

仅使用
退出
退出脚本文件(
*.ps1
),而不是类方法或函数。

从类方法或函数调用
exit
,将立即作为一个整体退出PowerShell进程

若要报告类方法的错误,请使用终止错误,这是
-ErrorAction Stop
Throw
语句生成的错误

也就是说,只需使用
Get Childitem F:\-ErrorAction stop
而不使用
try
/
catch
,这会导致调用方必须捕获的(线程)终止错误。

相反,如果您只是想在方法中发出错误消息,而不影响执行流程,请注意,您不能从类方法中使用
写入错误
;但是,您可以使用
写入警告
写入主机
也可以,但不建议使用)

  • 警告除非方法是
    [void]
    类型的,否则不能盲目使用
    返回
    退出方法。您必须返回声明的返回类型的实例,而
    返回$null
    可以很好地表示“无返回值”对于引用类型,将
    返回$null
    与值类型一起使用,例如
    [int]
    [datetime]
    $null
    转换为该类型(对于返回类型
    [int]
    )或中断(对于返回类型
    [datetime]
    ,因为
    $null
    无法有意义地转换为该类型)

简而言之:PowerShell中的类方法的行为与其他PowerShell代码不同

  • 要写入成功输出流,必须使用
    return
    语句;不支持隐式输出

  • 若要报告错误,必须通过公共参数
    -ErrorAction Stop
    Throw
    语句或调用生成异常的.NET方法生成终止错误;非终止错误和尝试直接使用
    write error
    写入错误流的行为将被忽略

  • 但是,所有其他输出流(请参阅)都是通过的


在中讨论了这一可能令人惊讶的差异,并在中找到了澄清文档中行为的请求。

作为旁白:注释出
出口1
应使
写入主机
打印。是否确实不打印?什么PowerShell版本?PowerShell 7预览5我确实看到
写入主机
out在PowerShell Core 7.0.0-preview.6和Windows PowerShell 5.1中都有输出(我很确定preview.5的作用是相同的)。奇怪!我现在正在6.2.3(macos)和7(p6)上尝试此功能是的,它正在按预期工作。一旦我有了另一台笔记本电脑,我将不得不重新尝试。作为旁白:注释出
退出1
应该会使
写入H