Usare gestori di eccezioni filtrati dall'utente
I gestori di eccezioni filtrati dall'utente intercettano e gestiscono le eccezioni in base a requisiti definiti dall'utente per le singole eccezioni. Questi gestori usano l'istruzione catch
con la parola chiave when
(Catch
e When
in Visual Basic).
Questa tecnica è utile quando un particolare oggetto eccezione corrisponde a più errori. In questo caso l'oggetto presenta in genere una proprietà che contiene il codice di errore specifico associato all'errore. È possibile usare la proprietà del codice di errore nell'espressione per selezionare solo l'errore particolare che si desidera gestire in tale clausola catch
.
Nell'esempio riportato di seguito viene illustrata l'istruzione catch
/when
.
try
{
//Try statements.
}
catch (Exception ex) when (ex.Message.Contains("404"))
{
//Catch statements.
}
Try
'Try statements.
Catch When Err = VBErr_ClassLoadException
'Catch statements.
End Try
L'espressione della clausola filtrata dall'utente non è sottoposta ad alcuna restrizione. Se durante l'esecuzione dell'espressione filtrata dall'utente si verifica un'eccezione, quest'ultima viene ignorata e si considera che l'espressione di filtro abbia restituito il valore false. In questo caso Common Language Runtime continua la ricerca di un gestore per l'eccezione corrente.
Combinare l'eccezione specifica e le clausole filtrate dall'utente
Un'istruzione catch
può contenere sia l'eccezione specifica che le clausole filtrate dall'utente. Nel runtime viene prima eseguito il test dell'eccezione specifica. Se l'eccezione specifica ha esito positivo, verrà eseguito il filtro dell'utente. Il filtro generico può contenere un riferimento alla variabile dichiarata nel filtro della classe. Si noti che non è possibile invertire l'ordine delle due clausole di filtro.
L'esempio seguente illustra un'eccezione specifica nell'istruzione catch e la clausola filtrata dall'utente che usa la parola chiave when.
try
{
//Try statements.
}
catch (System.Net.Http.HttpRequestException ex) when (ex.Message.Contains("404"))
{
//Catch statements.
}
Try
'Try statements.
Catch cle As ClassLoadException When cle.IsRecoverable()
'Catch statements.
End Try