捕捉条款从未到达

时间:2018-02-12 18:13:23

标签: powershell sharepoint-2010 powershell-v2.0

我不明白为什么永远不会达到以下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"
 }

2 个答案:

答案 0 :(得分:0)

在powershell中,异常必须是触发catch句的终止错误,简单的方法是设置$ ErrorActionPreference =&#39; Stop&#39;。

答案 1 :(得分:0)

当内部进程抛出一些错误时,发生了调用错误的目标。看起来当一个循环正在为一个网络上的所有网络运行时,你没有访问权限并且可能导致问题,但我仍然不确定为什么它没有达到捕获部分。