Private/Invoke-OriAzExrExceptionRetry.ps1
<#
.DESCRIPTION This script executing script block, but whenever it throw exception listed in parameter, than it retry the execution. When MaxRetry is reached than it fails. .SYNOPSIS This script executing script block, but whenever it throw exception listed in parameter, than it retry the execution. When MaxRetry is reached than it fails. .PARAMETER ScriptBlockToRun Code to execute .PARAMETER ListedExceptions List of execptions where is the reason to retry. .PARAMETER MaxRetry Max number of retry .PARAMETER SleepTimeInSec Sleep time in seconds .EXAMPLE Invoke-ExceptionRetry ` -ScriptBlockToRun {write-host "test"} ` -ListedExceptions @('Timeout','Retray later') ` -MaxRetry 2 #> function Invoke-OriAzExrExceptionRetry { [CmdletBinding()] param ( [Parameter(Mandatory = $true, HelpMessage = "Code to execute")] [ScriptBlock]$ScriptBlockToRun, [Parameter(Mandatory = $false, HelpMessage = "List of execptions where is the reason to retry.")] [string[]] $ListedExceptions = @(), [Parameter(Mandatory = $false, HelpMessage = "Max number of retry")] [string] $MaxRetry = 10, [Parameter(Mandatory = $false, HelpMessage = "Sleep time in seconds")] [string] $SleepTimeInSec = 10 ) #in case of any error we want to stop execution, in stderr having the error. Use try-catch to handle errors if needed. $ErrorActionPreference = "Stop"; Write-Debug "-- Invoke-ExceptionRetry --" $retry = $true $retryCount = 0; while($retry) { Write-Debug "Try number: $retryCount" try { $ScriptBlockToRun.Invoke(); $retry = $false } catch [Exception] { if( ![string]::IsNullOrEmpty($_) ` -and ![string]::IsNullOrEmpty($_.Exception) ` -and ![string]::IsNullOrEmpty($_.Exception.Message) ` -and (Test-OriAzExrIsInExceptionList ` -ListedExceptions $ListedExceptions ` -ExceptionMessage $_.Exception.Message) ` ) { Write-Warning ($_.Exception|format-list -force | Out-String) $retry = $true Start-Sleep -Seconds $SleepTimeInSec } else { Write-Error ($_.Exception|format-list -force | Out-String) $retry = $false } } $retryCount++; if($retryCount -ge $MaxRetry) { throw "Max retry [$MaxRetry] has been reached!" } } Write-Debug "End of processing Invoke-OriAzExrExceptionRetry" } |