如何在PowerShell中仅捕获SQL超时错误?

如何在PowerShell中仅捕获SQL超时错误?,powershell,exception,timeout,powershell-5.0,invoke-sqlcmd,Powershell,Exception,Timeout,Powershell 5.0,Invoke Sqlcmd,我试图在PowerShell 5.1的脚本中仅捕获超时错误。错误打印出执行超时,但当我打印出错误名称时,返回的是[Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionException]。这会捕获超时错误,但也会捕获其他错误。有没有办法只指定超时错误 试试看 { $results1=调用Sqlcmd-Query$Query-ConnectionString$ConnectionString } 捕获[Microso

我试图在PowerShell 5.1的脚本中仅捕获超时错误。错误打印出执行超时,但当我打印出错误名称时,返回的是
[Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionException]
。这会捕获超时错误,但也会捕获其他错误。有没有办法只指定超时错误

试试看
{
$results1=调用Sqlcmd-Query$Query-ConnectionString$ConnectionString
}
捕获[Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionException]
{
写入输出“超时错误。重试”
}
没有捕获的错误
catch

调用Sqlcmd:执行超时已过期。操作完成前已过超时时间,或者服务器没有响应


下面是我上述评论的一个例子,可能会有帮助

try {
    [System.Void](New-Item -Path $LogPath -ItemType Directory -ErrorAction Stop)
} catch {
    If ($Error[0].CategoryInfo.Category -eq 'PermissionDenied' -or
        $Error[0].CategoryInfo.Reason -eq 'UnauthorizedAccessException') {
        Write-Output -InputObject "Please check that you have access to create a directory."
    } Else {
        Write-Output -InputObject "An error has occurred: $($Error[0].Exception.Message)."
    } # End If-Else.
} # End try-catch.

下面是我上述评论的一个例子,可能会有帮助

try {
    [System.Void](New-Item -Path $LogPath -ItemType Directory -ErrorAction Stop)
} catch {
    If ($Error[0].CategoryInfo.Category -eq 'PermissionDenied' -or
        $Error[0].CategoryInfo.Reason -eq 'UnauthorizedAccessException') {
        Write-Output -InputObject "Please check that you have access to create a directory."
    } Else {
        Write-Output -InputObject "An error has occurred: $($Error[0].Exception.Message)."
    } # End If-Else.
} # End try-catch.

我无法找到
[SqlPowerShellSqlExecutionException]
类的任何文档,但是,通过检查
SqlServer
模块(特别是
Microsoft.SqlServer.Management.PSSnapins
程序集),我能够找到直接从中派生的异常类(因此,没有一个通用的SQL异常类型可以代替
catch
),它只包含一个名为
SqlError
且类型为的属性

不幸的是,查看该文档时,没有一个很好的枚举属性来描述各种潜在错误,但是我确实看到了一个。我有点困惑该页面上表的最后一列指示了什么,但是如果您像这样编写
catch

Catch[Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionException]
{
#在处指定的错误号https://docs.microsoft.com/dotnet/api/system.data.sqlclient.sqlerror.number#remarks
if($\异常.SqlError.Number-eq-2)
{
写入输出“超时错误。重试”
}
}
…或者像这样

Catch[Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionException]
{
#在处指定的错误号https://docs.microsoft.com/dotnet/api/system.data.sqlclient.sqlerror.number#remarks
if($\异常.SqlError.Number-等式258)
{
写入输出“超时错误。重试”
}
}

…这将允许您专门指定超时错误。或者您可能需要检查这两个错误号。请查看一个与之匹配的错误列表的长列表,也可以考虑编写您的<代码> catch <代码>块,以检查超时错误的< <代码>编号>代码>…/p>

Catch[Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionException]
{
$\ Exception.SqlError |选择对象-属性“Number”,“Message”
}
还有一个,所以作为最后的手段,你总是可以这样做

Catch[Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionException]
{
#TODO:Is$\异常。SqlError。消息。。。
#-…与$\异常.Message相同的字符串?
#-…一个子串$\异常.Message?
#-…比$\异常.Message更具体?
if($\异常.SqlError.Message-eq“执行超时已过期。操作完成前已过超时时间,或者服务器未响应”。)
{
写入输出“超时错误。重试”
}
}

顺便说一句,如果您的目的是向用户提供反馈,那么可能正好达到向控制台写入文本的目的,或者更适合使用cmdlet。请参阅。

我找不到
[SqlPowerShellExecutionException]的任何文档
class,但是,通过检查
SqlServer
模块(特别是
Microsoft.SqlServer.Management.PSSnapins
assembly),我能够找到直接从中派生的异常类(因此没有通用的SQL异常类型,您可以
catch
)并且只包含一个名为
SqlError
且类型为的属性

不幸的是,查看该文档时,没有一个很好的枚举属性来描述各种潜在错误,但是我确实看到了一个。我有点困惑该页面上表的最后一列指示了什么,但是如果您像这样编写
catch

Catch[Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionException]
{
#在处指定的错误号https://docs.microsoft.com/dotnet/api/system.data.sqlclient.sqlerror.number#remarks
if($\异常.SqlError.Number-eq-2)
{
写入输出“超时错误。重试”
}
}
…或者像这样

Catch[Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionException]
{
#在处指定的错误号https://docs.microsoft.com/dotnet/api/system.data.sqlclient.sqlerror.number#remarks
if($\异常.SqlError.Number-等式258)
{
写入输出“超时错误。重试”
}
}

…这将允许您专门指定超时错误。或者您可能需要检查这两个错误号。请查看一个与之匹配的错误列表的长列表,也可以考虑编写您的<代码> catch <代码>块,以检查超时错误的< <代码>编号>代码>…/p>

Catch[Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionException]
{
$\ Exception.SqlError |选择对象-属性“Number”,“Message”
}
还有一个,所以作为最后的手段,你总是可以这样做

Catch[Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionExcep