【问题标题】:PowerShell Forms, Try/Catch Not Stopping Application ProperlyPowerShell 表单,尝试/捕获未正确停止应用程序
【发布时间】:2018-03-01 21:10:05
【问题描述】:

问题

我正在使用 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 来解释如何正确处理这样的情况,以便代码在遇到这样的嵌套错误后停止运行?

【问题讨论】:

  • 我建议使用$PSCmdlet.ThrowTerminatingError() 而不是throw 关键字。它需要 ErrorRecord 作为构造函数。
  • 另外,在您的代码中,除了显示一条消息之外,您没有对 catch 语句执行任何操作,因此您需要以某种方式终止进程 (Stop-Process -Id $global:PID)
  • 啊,我明白了。这正是我想要的。再次感谢您
  • @TheIncorrigible1 Stop-Process,这也会终止表单和操作,还是直接终止操作?
  • Stop-Process 位将杀死正在调用的函数

标签: powershell error-handling try-catch


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多