Private/Resolve-LMException.ps1
<# .SYNOPSIS Function to handle exceptions that occur during API requests. .DESCRIPTION The Resolve-LMException function is used to handle exceptions that occur during API requests and throttle the requests if they exceed the rate limit. .PARAMETER LMException The exception object that is thrown during the API request. .EXAMPLE Resolve-LMException -LMException $exception #> Function Resolve-LMException { Param ( $LMException ) #Add in rate limit handling If ($LMException.Exception.Response.StatusCode.value__ -eq 429) { $RateLimitWindow = $LMException.Exception.Response.Headers.Value[$LMException.Exception.Response.Headers.Key.IndexOf("x-rate-limit-window")] $RateLimitSize = $LMException.Exception.Response.Headers.Value[$LMException.Exception.Response.Headers.Key.IndexOf("x-rate-limit-limit")] #$RateLimitRemaining = $LMException.Exception.Response.Headers.Value[$LMException.Exception.Response.Headers.Key.IndexOf("x-rate-limit-remaining")] Write-Warning "Request exceeded rate limit window of $RateLimitSize requests over $RateLimitWindow seconds, retrying operation in $RateLimitWindow seconds" Start-Sleep -Seconds $RateLimitWindow return $true } #Handle all other errors ELse { Switch ($LMException.Exception.GetType().FullName) { { "System.Net.WebException" -or "Microsoft.PowerShell.Commands.HttpResponseException" } { Try { $HttpException = ($LMException.ErrorDetails.Message | ConvertFrom-Json -ErrorAction SilentlyContinue).errorMessage If (!$HttpException) { $HttpException = ($LMException.ErrorDetails.Message | ConvertFrom-Json -ErrorAction Stop).message } } Catch { $HttpException = $LMException.ErrorDetails.Message } $HttpStatusCode = $LMException.Exception.Response.StatusCode.value__ #Output to null so ErrorAction works as expected Write-Error "Failed to execute web request($($HttpStatusCode)): $HttpException" 2>$null #Write to $Error object but suppress so stack trace is not displayed Write-Error "Failed to execute web request($($HttpStatusCode)): $HttpException" -ErrorAction SilentlyContinue #Pretty print error to console If ($ErrorActionPreference -ne "SilentlyContinue") { [Console]::ForegroundColor = 'red' [Console]::Error.WriteLine("Failed to execute web request($($HttpStatusCode)): $HttpException") [Console]::ResetColor() } } default { $LMError = $LMException.ToString() #Output to null so ErrorAction works as expected Write-Error "Failed to execute web request: $LMError" 2>$null #Write to $Error object but suppress so stack trace is not displayed Write-Error "Failed to execute web request: $LMError" -ErrorAction SilentlyContinue #Pretty print error to console If ($ErrorActionPreference -ne "SilentlyContinue") { [Console]::ForegroundColor = 'red' [Console]::Error.WriteLine("Failed to execute web request: $LMError") [Console]::ResetColor() } } } Return $false } } |