【问题标题】:Powershell Try Catch invoke-sqlcmdPowershell Try Catch 调用-sqlcmd
【发布时间】:2012-11-16 15:07:12
【问题描述】:

当使用 Invoke-Sqlcmd 连接到 SQL Server 失败时,我无法在 PowerShell 中捕获错误。这是一些用于演示该问题的通用代码:

CLS
$server = "Localhost\fake"
try
{
    Invoke-Sqlcmd -Query "SELECT DB_NAME() as [Database]" -Server $server
}
catch
{
    Write-Host "Error connecting to server " $server
}

我收到以下错误:

Invoke-Sqlcmd:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称 是正确的,并且 SQL Server 配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)

我希望得到一行语句:“连接到服务器 Localhost\fake 时出错”

【问题讨论】:

  • 我在 powershell v3 上,你的代码给了我你的自定义错误。
  • 谢谢,很高兴知道,我显然还在 2.

标签: powershell try-catch try-catch-finally


【解决方案1】:

发布附加信息以补充@KeithHill 的答案作为答案,因为评论太长了。

如果错误记录是由 Write-Error commandlet 创建的,则它是非终止的,并且受 -ErrorAction 参数或 $ErrorActionPreference 系统变量指定的行为的影响。使用 throw 的错误正在终止。请参阅Write-Error 的文档(请注意,PowerShell 4.0 及以下版本没有网页中提到的 -Exception 参数。)和 PowerShell 帮助系统中的about_Throw

如果您想添加自定义错误信息并使其成为终止错误,请从您的 catch 块中抛出如下:

catch
{
    throw (New-Object System.Exception "Error connecting to server $($server).", $_.Exception)
}

如果您希望终止的行为与 -ErrorAction 参数指定的一样,您可以使用 Write-Error。在 PowerShell 4.0 及更低版本中,Write-Error 命令行开关不允许使用 -Exception 参数,因此不会提供 InnerException。这意味着调用者必须检查 $Error 系统变量中的集合,如果它需要确定原始异常。在以后的版本中,您可以在 catch 块中使用 Write-Error -Message "Some additional error information." -Exception $_.Exception

【讨论】:

    【解决方案2】:

    试试

    CLS
    $server = "Localhost/fake"
    try
    {
        Invoke-Sqlcmd -Query "SELECT DB_NAME() as [Database]" -Server $server
    }
    catch
    {
        $_ | Out-Null
        Write-Host "Error connecting to server " $server
    }
    

    这将捕获错误并将其重定向到 null 并显示您的写入主机

    【讨论】:

    • 我认为您在倒数第二行的末尾有一个额外的 }。我试过这个,我仍然得到错误。
    【解决方案3】:

    看起来错误被认为是非终止的,这有点奇怪。尝试使用附加参数的 Invoke-SqlCommand:-ErrorAction Stop。如果存在非终止错误,这会将其转换为您可以捕获的终止错误。

    【讨论】:

    • 这有一个缺点——通过添加-ErrorAction Stop,Powershell 会在错误的第一行停止,这意味着您丢失了被写入错误输出的关键信息,即错误究竟在哪里失败.基本上,Powershell 的错误处理是热垃圾。但这不是新闻。
    • 好吧,您不会丢失该信息。如果带有-ErrorAction Stop 的命令不在try/catch 中,则该信息仍将被写入错误流。如果仍在try/catch 中,您可以从catch 中写入错误信息:catch { Write-Error $_ }
    猜你喜欢
    • 2013-11-25
    • 2017-11-23
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多