La semantica del Catch in Visual Basic .NET consente di specificare una clausola When quando si specifica l'eccezione da catturare:
Dim I As Integer = 5
Try
I = I / 0
Catch ex As OverflowException When IsValid(I)
MessageBox.Show("Errore")
End Try
Dove IsValid è una funzione che restuisce un booleano: se ritorna True, viene eseguito il blocco di codice corrispondente all'eccezione da gestire; altrimenti, viene lanciata un'eccezione di tipo OverflowException che non è catturata dal blocco Try. Questa sintassi non è molto diversa dall'avere il classico Catch e poi, al suo interno, una serie di controlli per determinare più precisamente l'errore.
Tuttavia, c'è una differenza tra questi due approcci. Nell'esempio sopra riportato, se IsValid restituisce False, di fatto l'eccezione OverflowException viene considerata non gestita, quindi viene rilanciata. Al contrario, utilizzando il Catch "semplice" e gli If al suo interno, se nessuno dei controlli "scatta" non viene ri-lanciata alcuna eccezione in automatico, a meno di non usare esplicitamente l'istruzione Throw.
Fonte: MSDN Magazine