'Try Catch/Exception for ManagementObjectNotFoundException and ActiveDirectory/Outlook

This might be a pretty basic question, but i haven't seen it on the forms. Bear with me i'm new to powershell

I'm trying to catch this exception(ManagementObjectNotFoundException) when a username is not found in our Active Directory Database.

Set-ExecutionPolicy RemoteSigned
$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection
Import-PSSession $Session -DisableNameChecking
$user2 = Read-Host 'Enter account name of the user who is being added'
try {
$user = Read-Host 'Enter account name of the users email you wish to have access to'
Add-MailboxPermission –Identity $user -User $user2 -AccessRights FullAccess –InheritanceType All –Automapping $false
}
catch [ManagementObjectNotFoundException] {
    "User not found, try again"
     $user = Read-Host 'Enter account name of the users email you wish to have access to - Test'
}
Remove-PSSession $Session

I've also tried this option:

catch {
  Write-Host "An error occurred:"
  Write-Host $_
}

and I still receive this error:

The operation couldn't be performed because object 'test1' couldn't be found on 'BN4PR12A003DC03.NAMPR12A003.PROD.OUTLOOK.COM'.
    + CategoryInfo          : NotSpecified: (:) [Add-MailboxPermission], ManagementObjectNotFoundException
    + FullyQualifiedErrorId : [Server=BYAPR12MB2885,RequestId=25cd1eb7-055e-4250-bd43-6d2f5d528f12,TimeStamp=11/12/2019 9:38:16 PM] [FailureCategory=Cmdlet-ManagementObjectNotFoundException] C5EDB577,Microsoft.Exchange.Management.RecipientTasks.AddMailboxP 
   ermission
    + PSComputerName        : outlook.office365.com


Solution 1:[1]

You need to throw what's called a terminating error in order to catch exceptions. You can set the error action preference at your script level:

$ErrorActionPreference = "Stop"

or add -ErrorAction Stop to any cmdlets you want to catch errors from. Errors can't be caught if the exception is non-terminating. By default, errors are set to Continue but can be changed in one of the ways above:

Error Action Preferences

  • Continue: Displays the error but continues with execution. This is the default.
  • SilentlyContinue: Hides the error and continues with execution.
  • Stop: Throws a terminating error. The error action must be set to Stop to catch exceptions.
  • Inquire: Asks the user what to do.
  • Suspend: Used with Powershell Workflows. Suspends a Workflow job so it can be resumed later.
  • Ignore: Similar to SilentlyContinue, it suppresses the error and continues executing. Can only be set with the -ErrorAction parameter, Ignore cannot be set to $ErrorActionPreference.

A Note About Terminating errors

Note that terminating errors cannot be converted to non-terminating in the same way we can treat non-terminating errors as terminating. In other words, most exceptions originating from the framework or exceptions thrown from PowerShell with the throw statement must be handled via try/catch/finally blocks. Neither $ErrorActionPreference or -ErrorAction has any bearing on how the exception is handled.

As this restriction includes Ignore and SilentlyContinue, you cannot suppress or ignore terminating errors with these preference values. You must handle them to prevent script termination.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1