Invoke-Parallel icon indicating copy to clipboard operation
Invoke-Parallel copied to clipboard

$ErrorActionPreference = "Stop" may have unintended consequences

Open codykonior opened this issue 8 years ago • 3 comments

This line:

$runspace.powershell.EndInvoke($runspace.Runspace)

Means that if your session is set to stop on errors, and any of your jobs write an error, Invoke-Parallel will error out at the point it is receiving the data.

You might want to evaluate:

try { 
$runspace.powershell.EndInvoke($runspace.Runspace) 
} catch { 
Write-Error $_ -ErrorAction Continue
}

This still writes the error but doesn't abort the pipeline; it can also be stored for later when called using something like Invoke-Parallel -ErrorVariable MyErrorList

codykonior avatar Sep 08 '16 02:09 codykonior

Do you think this would invoke a similar issue with PoshRSJob module?

oldlost avatar Sep 13 '16 18:09 oldlost

same issue

$ErrorActionPreference = "Stop"
 try { Write-Error "fsdfs" }  catch { Write-Host "First catch"} 
 1 | Invoke-Parallel -ImportModules -ImportVariables -ScriptBlock { 
        try {Write-Error "fsdfs"}
        catch {
            Start-Sleep -s 10
            Write-Host "Second catch"
        } 
    }

The first catch works , but invoke-parallel will not go into the second catch block. instead the evaluation of "$runspace.Runspace.isCompleted" will immediately become true and go into following code block

                #check if there were errors
                    if ($runspace.powershell.Streams.Error.Count -gt 0) {
                        #set the logging info and move the file to completed
                        $log.status = "CompletedWithErrors"
                        Write-Host ($log | ConvertTo-Csv -Delimiter ";" -NoTypeInformation)[1]
                        foreach ($ErrorRecord in $runspace.powershell.Streams.Error) {
                            Write-Error -ErrorRecord $ErrorRecord
                        }
                    }

output : "4/25/2018 5:14:48 PM";"Removing:'1'";"0.0110033 seconds";"CompletedWithErrors"; The above section also have issue with Error stream check, it should use $runspace.powershell.HadErrors check in my opinion. When the scriptblock throw someexceptionmessage , the error stream will not get populated, and the status will become "Completed" instead of "CompletedWithErrors". But the HadErrors will still get set.

I guess also should add ErrorActionPreference check like VerbosePreference check as following , although I don't understand why $VerbosePreference should be checked.

if ($VerbosePreference -eq 'Continue') {
                    [void]$PowerShell.AddScript( {$VerbosePreference = 'Continue'})
                }

yl10030270 avatar Apr 26 '18 00:04 yl10030270

i did something like this to try and catch the inner error:

if ($obj.Value.Powershell.HadErrors -and ($obj.Value.Powershell.Streams.Error.count -eq 0))
{
  Try 
  {
    $Obj.Value.Powershell.endinvoke($Obj.Value.Handle)
   }
    catch
    {
      $errorstream = $_.Exception.InnerException.ErrorRecord
     }
   }
  else
  {
   $errorstream = $obj.Value.Powershell.Streams.Error.readall()
  }

Hansson0728 avatar Mar 08 '21 10:03 Hansson0728