PowerShell表单,尝试/捕获不正确停止应用程序

时间:2017-09-20 17:25:23

标签: powershell error-handling try-catch

问题

我正在使用PowerShell创建一个使用使用Forms创建的GUI的应用程序。在尝试保持模块化编程风格的同时,我或多或少地撞到了一堵墙,我似乎无法找到方法,并且希望社区可以提供帮助。

在我的应用程序中,我尝试使用try / catch语句创建自定义错误捕获,但是发现当我调用工厂函数并且该函数有错误时,应用程序将按预期显示所述错误,但是继续处理就好像它成功了......

我甚至尝试使用exitbreak,但最终出现了一个“未处理的异常”错误,该错误紧跟在我的自定义错误之后。我甚至设置了$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,以解释如何正确处理这样的情况,以便在遇到像这样的嵌套错误后代码停止运行?

1 个答案:

答案 0 :(得分:2)

为了确保您的Try被设置为处理终止错误,请使用$PSCmdlet.ThrowTerminatingError()。这可以将ErrorRecord对象作为构造函数,允许您捕获特定的异常类型。