继续执行异常

Posted

技术标签:

【中文标题】继续执行异常【英文标题】:Continue execution on Exception 【发布时间】:2013-04-26 05:51:21 【问题描述】:

下面是我要执行的脚本。这里的问题是一旦发生异常就会停止执行,我在 catch 块中使用了continue,但这不起作用。即使在发生异常后它应该在foreach 中循环,我如何让它工作。

我也使用了while($true) 循环,但它进入了无限循环。该怎么办?

$ErrorActionPreference = "Stop";
try 

# Loop through each of the users in the site
foreach($user in $users)

    # Create an array that will be used to split the user name from the domain/membership provider
    $a=@()


    $displayname = $user.DisplayName
    $userlogin = $user.UserLogin


    # Separate the user name from the domain/membership provider
    if($userlogin.Contains('\'))
    
        $a = $userlogin.split("\")
        $username = $a[1]
    
    elseif($userlogin.Contains(':'))
    
        $a = $userlogin.split(":")
        $username = $a[1]
    

    # Create the new username based on the given input
    $newalias = $newprovider + "\" + $username

    if (-not $convert)
    
        $answer = Read-Host "Your first user will be changed from $userlogin to $newalias. Would you like to continue processing all users? [Y]es, [N]o"

        switch ($answer)
        
            "Y" $convert = $true
            "y" $convert = $true
            default exit
        
       

    if(($userlogin -like "$oldprovider*") -and $convert)
      

        LogWrite ("Migrating User old : " + $user + " New user : " + $newalias + "    ")
        move-spuser -identity $user -newalias $newalias -ignoresid -Confirm:$false
        LogWrite ("Done")
       
 

catch  
    LogWrite ("Caught the exception")
    LogWrite ($Error[0].Exception)
 

【问题讨论】:

为什么不改变$ErrorActionPreference = "Continue"?不适合你? 是否存在导致异常的特定行? 【参考方案1】:

当您想要处理错误时,您可以使用try ... catch ...。如果你想忽略它们,你应该将$ErrorActionPreference = "Continue"(或"SilentlyContinue")设置为@C.B。建议,或使用-ErrorAction "SilentlyContinue" 进行引发错误的特定操作。如果你想处理某个指令的错误,你应该把那个指令放在try ... catch ... 块中,而不是整个循环,例如:

foreach($user in $users) 
  ...
  try 
    if(($userlogin -like "$oldprovider*") -and $convert)   
      LogWrite ("Migrating User old : " + $user + " New user : " + $newalias + "    ")
      move-spuser -identity $user -newalias $newalias -ignoresid -Confirm:$false
      LogWrite ("Done")
       
   catch 
    LogWrite ("Caught the exception")
    LogWrite ($Error[0].Exception)
  
 

【讨论】:

因为我想记录非终止错误,设置 '$ErrorActionPreference' 对我没有多大帮助。它工作的唯一时间是 '$ErrorActionPreference = "Stop"' 但执行在 catch 时停止。即使出现错误,我也想继续执行。请看我的回答,解决了我的问题。感谢您的回答。 :) 您需要Stop 作为try..catch 工作的错误操作,因为它只捕获终止错误。如果没有终止错误,一开始就没有什么可以捕捉到的。 -ErrorAction 不适用于异常。例如。如果你想忽略 Set-ExecutionPolicy 的失败,唯一没有错误输出的方法是 Catch[System...] 。请注意,您需要空间,否则 Catch 将被解析为空并导致错误!【参考方案2】:

您似乎已将“catch”放在循环主体之外,因此中止了循环。将 catch 放入循环中

【讨论】:

请提供更多解释和代码,因为这些可能有助于将来参考 在 OP 代码中,catch 块位于循环之外。下面是一个例子: foreach($a in $list) try dosomething Write-Output "Yay, I did something!" Catch 写输出“呃,哦。世界末日。” 当异常被捕获时,在循环外被捕获。【参考方案3】:

修改代码如下。在move-spuser -identity $user -newalias $newalias -ignoresid -Confirm:$false之后使用了下面这段代码

if($?)

  LogWrite ("Done!")
  LogWrite ("  ")

else

  LogWrite ($Error[0].ToString())
  LogWrite ("  ")

【讨论】:

不要使用$?。曾经。而是检查$LastExitCode(请参阅here)。 $LastExitCode 不是用于可执行文件,而不是用于 PowerShell cmdlet、脚本或函数吗?【参考方案4】:

对我有用的方法是将 $ErrorActionPreference 变量设置为停止,然后将其重置为在 catch 块中继续:

$e = $ErrorActionPreference
$ErrorActionPreference="stop"

try

     #Do Something that throws the exception

catch

    $ErrorActionPreference=$e



$ErrorActionPreference=$e;

【讨论】:

以上是关于继续执行异常的主要内容,如果未能解决你的问题,请参考以下文章

继续执行异常

java中异常抛出后代码还会继续执行吗

oracle出现异常如何继续执行

java中异常抛出后代码还会继续执行吗

Laravel:是不是可以在捕获异常时记录堆栈跟踪并继续执行?

java try catch 异常后还会继续执行吗