Powershell类中try/catch的输出
在powershell中尝试使用类时,我不确定如何显示输出。例如,在此代码块中,写入错误不会显示错误消息: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
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