我不明白为什么永远不会达到以下PowerShell代码中的catch子句。
在这种情况下,我能够完美地检索SPSite对象,但是访问AllWebs属性将导致立即的,不可捕获的错误Exception has been thrown by the target of an invocation
。
$Url = 'SiteURl...'
$SiteCol = Get-SPSite $url
try {
$wbs = $SiteCol.AllWebs
}
catch {
# catch is never reached!
Write-Error ("{0}`n`n" -f $_)
return
}
PowerShell将$wb.GetType()
报告为
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False SPWebCollection Microsoft.SharePoint.SPBaseCollection
输入变量$ wbs将显示与Exception has been thrown by the target of an invocation
相同的错误消息$web | get-member
这是非常奇怪的PowerShell行为,我不明白。为什么从未达到catch条款?为什么我可以访问我的$ wbs变量的类型但是无法访问成员或变量本身?
更新1
$Url = 'SiteUrl'
$SiteCol = Get-SPSite $url
$ErrorActionPreference = "Stop"
try {
$wbs = $SiteCol.AllWebs
Write-Host "Site Returned"
$wbs # <----- Error here!
Write-Host "Done"
}
catch {
# catch is never reached
Write-Host ("Error")
}
$ErrorActionPreference = "Continue"
这是执行此代码时的输出
Site Returned
Exception has been thrown by the target of
an invocation.
At line:1 char:2
+ . <<<< .\Run-Get-SPWebInfo.ps1
+ CategoryInfo : NotSpecified: (:) [Run-Get-SPWebInfo.ps1], TargetInvocationException
+ FullyQualifiedErrorId : System.Reflection.TargetInvocationException,Run-Get-SPWebInfo.ps1
更新2已解决的解决方法
我根本无法解释这一点,但如果有人可以认为它已经回答了!
将调用包含在它自己的函数中允许我的主代码按预期捕获错误。
function Test-AllWebs{
param([Microsoft.SharePoint.SPSite] $site)
$wbs = $SiteCol.AllWebs
$wbs
}
$Url = 'SiteURl...'
$SiteCol = Get-SPSite $url
try {
Write-Host "Site Returned"
Test-AllWebs -site $SiteCol
}
catch {
Write-Host ("Error caught!")
} finally{
Write-Host "Done"
}
答案 0 :(得分:0)
在powershell中,异常必须是触发catch句的终止错误,简单的方法是设置$ ErrorActionPreference =&#39; Stop&#39;。
答案 1 :(得分:0)
当内部进程抛出一些错误时,发生了调用错误的目标。看起来当一个循环正在为一个网络上的所有网络运行时,你没有访问权限并且可能导致问题,但我仍然不确定为什么它没有达到捕获部分。