【发布时间】:2018-03-01 21:10:05
【问题描述】:
问题
我正在使用 PowerShell 创建一个应用程序,该应用程序使用使用 Forms 创建的 GUI。在尝试保持模块化编程风格时,我或多或少地撞到了一堵墙,我似乎找不到解决办法,希望社区能提供帮助。
在我的应用程序中,我尝试使用 try/catch 语句创建自定义错误捕获,但发现当我调用工厂函数并且该函数有错误时,应用程序将按预期显示所述错误,但会继续处理就好像成功了...
我什至尝试过使用exit 和break,但在我的自定义错误之后立即出现“未处理的异常”错误。我什至设置了$ErrorActionPreference = "Stop",但仍然遇到这个问题。
这是我的代码的简化示例,以便您了解发生了什么:
Button_Click = {
ValidatePathing -BackupPath $BackupPath.Text
If (!(Test-Path $BackupPath.Text)) {
# Attempt to Create it
}
# bunch of code
}
Function ValidatePathing ([string]$BackupPath){
Try {
If (!$BackupPath) {
throw "customError1"
}
If ($BackupPath -match "\|") {
throw "customError2"
}
}
Catch {
If ($_.Exception.Message -eq "customError1") {
[System.Windows.Forms.MessageBox]::Show("some message")
}
ElseIf ($_.Exception.Message -eq "customError2") {
[System.Windows.Forms.MessageBox]::Show("some message")
}
}
}
不幸的是,当代码遇到ValidatePathing 之类的部分并发生自定义错误时,错误消息将按预期显示,但代码随后将跳过/通过该部分并继续处理其余代码,尽管有错误。
问题
有没有人足够了解 PowerShell 来解释如何正确处理这样的情况,以便代码在遇到这样的嵌套错误后停止运行?
【问题讨论】:
-
我建议使用
$PSCmdlet.ThrowTerminatingError()而不是throw关键字。它需要ErrorRecord作为构造函数。 -
另外,在您的代码中,除了显示一条消息之外,您没有对 catch 语句执行任何操作,因此您需要以某种方式终止进程 (
Stop-Process -Id $global:PID) -
啊,我明白了。这正是我想要的。再次感谢您
-
@TheIncorrigible1
Stop-Process,这也会终止表单和操作,还是直接终止操作? -
Stop-Process位将杀死正在调用的函数
标签: powershell error-handling try-catch