我无法找到[SqlPowerShellSqlExecutionException]
该类的任何文档,但是,通过下载和检查SqlServer
模块(特别是Microsoft.SqlServer.Management.PSSnapins
程序集),我能够发现异常类直接派生自[Exception]
(因此没有通用的 SQL 异常类型可以catch
代替) 并且只包含一个名为SqlError
and 类型的属性[SqlError]
。
不幸的是,看看那个文档,没有一个很好的枚举属性来描述各种潜在的错误,但是我确实看到有一个Number
property。我有点困惑该页面上表格的最后一列是什么意思,但如果你这样写你的catch
块似乎......
Catch [Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionException]
{
# Error number specified at https://docs.microsoft.com/dotnet/api/system.data.sqlclient.sqlerror.number#remarks
if ($_.Exception.SqlError.Number -eq -2)
{
Write-Output "Timeout error. Try again"
}
}
……或者像这样……
Catch [Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionException]
{
# Error number specified at https://docs.microsoft.com/dotnet/api/system.data.sqlclient.sqlerror.number#remarks
if ($_.Exception.SqlError.Number -eq 258)
{
Write-Output "Timeout error. Try again"
}
}
...这将允许您专门针对超时错误。或者您可能需要检查这两个错误号。有关要匹配的冗长错误编号列表,请参阅数据库引擎事件和错误catch
,还可以考虑像这样编写块来检查Number
超时错误所获得的内容...
Catch [Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionException]
{
$_.Exception.SqlError | Select-Object -Property 'Number', 'Message'
}
还有一个SqlError.Message
财产,所以作为最后的手段,你总是可以做这样的事情......
Catch [Microsoft.SqlServer.Management.PowerShell.SqlPowerShellSqlExecutionException]
{
#TODO: Is $_.Exception.SqlError.Message...
# - ...the same string as $_.Exception.Message ?
# - ...a substring of $_.Exception.Message ?
# - ...more specific than $_.Exception.Message ?
if ($_.Exception.SqlError.Message -eq 'Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding.')
{
Write-Output "Timeout error. Try again"
}
}
顺便说一句,虽然Write-Output
可能会碰巧实现将文本写入控制台的目标,但如果您的意图是向用户提供反馈,那么Write-Host
,Write-Information
或者Write-Warning
将是更合适的 cmdlet。查看Write-Host 和 Write-Output 之间的 PowerShell 区别?.