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"
    
    }