PowerShell - 嵌套Try / Catch / Finally命令

时间:2015-09-11 11:57:49

标签: powershell powershell-v2.0

我尝试编写一段代码,使用一些Invoke-Sqlcmd命令(由系统中的错误引起)在PowerShell中删除并重新创建MS SQL数据库。如果目标机器上的另一个程序在发出drop命令时访问数据库,我想构建一些意外事件。我认为这样做的一个好方法是将一个Try / Catch / Finally命令嵌套在另一个中,就像这样;

$strDbName= database
$strUsername= user
$strPassword= pass
$strmdfFilePath= "C:\foo.mdf"
$strldfFilePath= "C:\bar.ldf"

Try
    {
    Write-Host "INFO: Attempting Database DROP command..."
    Invoke-SqlCmd -Username "$strUserName" -Password "$strPassword" -Query "DROP database [$strDbName];"
    }
Catch
    {
    Try
        {
        Invoke-SqlCmd -Username "$strUserName" -Password "$strPassword" -Query "ALTER database [$strDbName] set offline with ROLLBACK IMMEDIATE;"
        Invoke-SqlCmd -Username "$strUserName" -Password "$strPassword" -Query "DROP database [$strDbName];"
    }
    Catch
        {
        Write-Host "Error message"
        }
    Finally
        {
        Exit
        }
    }
Finally
    {
    Invoke-SqlCmd -Username "$strUserName" -Password "$strPassword" -Query "CREATE DATABASE [$strDbName] ON (FILENAME = '$dirMdfFilePath'),(FILENAME = '$dirLdfFilePath') for ATTACH;"
    }

两个问题 - A)嵌套Try / Catch / Finally命令实际上有效吗?和B)这种命令序列是否良好实践?我没有测试机器来试试这个,如果有更简单的方法来执行这样的命令,我宁愿知道。

1 个答案:

答案 0 :(得分:5)

A)嵌套的try / catch将起作用。这个简化的代码证明了它(并将帮助您在任何Windows中进行测试):

Write-Host "0"
Try
{
    Write-Host "1"
    throw
}
Catch
{
    Try
    {
        Write-Host "2"
        throw
    }
    Catch
    {
        Write-Host "3"
    }
    Finally
    {
        Write-Host "4"
        Exit
    }
}
Finally
{
    Write-Host "5"
}

B)但这不是一个好习惯。您的错误处理代码(在catch / finally中)代码应该是健壮的,易于阅读而不是复杂的事情。只是吐出错误消息以帮助调试,并可能关闭一些资源。

然而,这是有争议的......检查这个SO question