如何从catch块分支到finally-Powershell

如何从catch块分支到finally-Powershell,powershell,Powershell,我知道代码的“finally”部分将始终运行,但我看不到它在我的代码中发生。请帮忙 下面是我的一段代码: $ErrorActionPreference = "Stop" $connection.ConnectionString = "Data Source = " + $TDEnv + ";Connection Pooling Timeout=300;User Id=" + $TDUserID + ";Password=" + $TDPswd + ";" try{ $connectio

我知道代码的“finally”部分将始终运行,但我看不到它在我的代码中发生。请帮忙

下面是我的一段代码:

$ErrorActionPreference = "Stop"

$connection.ConnectionString = "Data Source = " + $TDEnv + ";Connection Pooling Timeout=300;User Id=" + $TDUserID + ";Password=" + $TDPswd + ";"
try{
    $connection.Open()
}
catch{
    Write-Host "An error occurred acquiring the connection to Teradata"
    Write-Host $_.Exception.Message
    Exit 99
}

$SqlCommand = "SELECT TableName AS TDProcName FROM dbc.TablesV WHERE 1 = 1 AND TableKind = '" + $TableKind + "' AND DatabaseName = '" + $DBName + "';"
$command = $connection.CreateCommand()
$command.CommandText = $sqlCommand

$adapter = $factory.CreateDataAdapter()
$adapter.SelectCommand = $command

$dataset = new-object System.Data.DataSet


try{
    [void] $adapter.Fill($dataset)

    $ProcNames = $dataset.Tables | Select-Object -Expand Rows

    #------Build the actual BTeq script------#
    ForEach($procNm in $ProcNames){

        #--------------------- This needs to be changed to make it dynamic, based on the param passed in ---------------------#
        $bTeqScrObj = $bTeqScrObj + ".EXPORT DATA FILE = E:\TFSObjects\BI\" + $Environment + "\Teradata\Procs\" + $procNm.Item(0).ToString() + ".sql; `r`n"
        $bTeqScrObj = $bTeqScrObj + ".SET RECORDMODE OFF; `r`n"
        $bTeqScrObj = $bTeqScrObj + "SHOW " + $ObjName +  "  " + $DBName + "." + $procNm.Item(0).ToString() + "; `r`n `r`n `r`n"
        #$bTeqScrObj = $bTeqScrObj + ".EXPORT RESET; `r`n `r`n `r`n"
    }

    $bTeqScrObj = $bTeqScrObj + ".LOGOFF; `r`n `r`n `r`n"
    $bTeqScrObj = $bTeqScrObj + ".EXIT 0;"

    Write-Host "This shouldnt show up on the screen `r`n"

    #----Materialize the script object to a file----#
    $bTeqScrObj | Out-File -FilePath $OutFile

    #------Run the actual BTeq script------#
    cat $OutFile | bteq
}
catch{
    Write-Host "An error occurred while processing the request:"
    Write-Host $_       
}   

finally{

        Write-Host "Yep, still got here!"

        if($connection.State -eq "Open"){
            $connection.Close()
        }

    }
但我看到的是代码的最后部分没有显示出来。 因此,我希望代码从第一个catch块分支到最后一个catch块。为什么没有发生

但是,如果第二个try/catch块中有错误,它将转到finally部分


注:我尝试删除退出,用throw替换,结果仍然一样。

我想我从来没有想过在
catch{}finally{}
之间可能会有代码执行,但我不认为这是可能的,这就像是
如果{}/*添加一些代码*/否则{}
您需要将您的
$SqlCommand
行放在catch中谢谢您的评论,但实际上我有多个try-catch块,最后一个catch就在最后一个catch之后,让我修改上面的代码,让您看得更清楚。@Number10哦,这更容易理解。我看得出你对语法有误解
try{}catch{}finally{}
必须匹配
finally
是可选的,因此当在第一个
try{}catch{}
块中省略它时,它将永远不会触发finally,因为正在调用
Exit
时,没有针对特定
try{}catch{}的finally块
我的建议是创建一个函数,您可以同时调用这两个函数!谢谢Andrei,我不知道在一个脚本中可以有多个
Finally
块,我一直认为每个脚本只能有一个
Finally
块,并且无论它属于哪个
try{}catch{}
块,它都会被执行。@Number10不用担心,我已经用一个可能的修复方法编辑了我的答案,以保持干燥(不要重复)
$ErrorActionPreference = "Stop"

$connection.ConnectionString = "Data Source = " + $TDEnv + ";Connection Pooling Timeout=300;User Id=" + $TDUserID + ";Password=" + $TDPswd + ";"
try{
    $connection.Open()
}
catch{
    Write-Host "An error occurred acquiring the connection to Teradata"
    Write-Host $_.Exception.Message
    Exit 99
}
finally {
    CleanUpDbConnection($connection)
}

$SqlCommand = "SELECT TableName AS TDProcName FROM dbc.TablesV WHERE 1 = 1 AND TableKind = '" + $TableKind + "' AND DatabaseName = '" + $DBName + "';"
$command = $connection.CreateCommand()
$command.CommandText = $sqlCommand

$adapter = $factory.CreateDataAdapter()
$adapter.SelectCommand = $command

$dataset = new-object System.Data.DataSet


try{
    [void] $adapter.Fill($dataset)

    $ProcNames = $dataset.Tables | Select-Object -Expand Rows

    #------Build the actual BTeq script------#
    ForEach($procNm in $ProcNames){

        #--------------------- This needs to be changed to make it dynamic, based on the param passed in ---------------------#
        $bTeqScrObj = $bTeqScrObj + ".EXPORT DATA FILE = E:\TFSObjects\BI\" + $Environment + "\Teradata\Procs\" + $procNm.Item(0).ToString() + ".sql; `r`n"
        $bTeqScrObj = $bTeqScrObj + ".SET RECORDMODE OFF; `r`n"
        $bTeqScrObj = $bTeqScrObj + "SHOW " + $ObjName +  "  " + $DBName + "." + $procNm.Item(0).ToString() + "; `r`n `r`n `r`n"
        #$bTeqScrObj = $bTeqScrObj + ".EXPORT RESET; `r`n `r`n `r`n"
    }

    $bTeqScrObj = $bTeqScrObj + ".LOGOFF; `r`n `r`n `r`n"
    $bTeqScrObj = $bTeqScrObj + ".EXIT 0;"

    Write-Host "This shouldnt show up on the screen `r`n"

    #----Materialize the script object to a file----#
    $bTeqScrObj | Out-File -FilePath $OutFile

    #------Run the actual BTeq script------#
    cat $OutFile | bteq
}
catch{
    Write-Host "An error occurred while processing the request:"
    Write-Host $_       
}   

finally{

        Write-Host "Yep, still got here!"

        CleanDbConnection($connection)

    }`enter code here`


function CleanDbConnection {
      if($args[0].State -eq "Open"){
                $args[0].Close()
            }
}