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