Cattura, Maniglia, quindi rigenerare eccezione?
-
20-08-2019 - |
Domanda
Mi sono imbattuto in un dilemma interessante oggi. Ho una funzione che gestisce le informazioni e controlli per i valori duplicati, quindi restituisce il numero successivo che non è un duplicato. Così, ho qualcosa di simile:
Public Function GetNextNonDuplicateNumber(NumberToCheck as Long) as Long
//the non-duplicate the function will return
Dim NonDuplicate as Long
If CheckForDuplicate(NumberToCheck) = True Then
Throw New DuplicateException()
Else
NonDuplicate = NumberToCheck
End If
End Function
Poi in fondo della funzione ho un blocco catch che gestisce il duplicato incrementando fino a quando non ho un duplicato più, in questo modo:
Catch ex as DuplicateException
NonDuplicate = IncrementToNonDuplicateValue(NumberToCheck)
Throw ex
Return NonDuplicate
End Function
Come si può vedere, voglio gestire l'eccezione in particolare, ma voglio anche gettarlo quando ho finito perché voglio avvisare altro codice di fuori della funzione.
Il problema è che semplicemente buttare esce dalla funzione con un valore null
. Sto pensando ad un try/catch
nel modo sbagliato, o c'è un modo per aggirare questo?
Soluzione
Se hai preso un'eccezione e recuperato da esso (con l'IncrementToNonDuplicate ...) allora non c'è ragione per gettare più un'eccezione. Codice tra cattura e prova finale dovrebbe solo pulire le risorse come la chiusura di un file o DataReader se si vuole rigenerare esso.
Si potrebbe piuttosto restituire una struttura che contiene il valore NonDuplicate e ha richiesto informazioni sugli errori nella funzione. Altro modo sarebbe quello di un'eccezione personalizzato che conterrà informazioni come quot; Numero non valido &: Dovrebbe essere ...)
Altri suggerimenti
È possibile restituire un valore booleano che indica se un duplicato viene trovato, e modificare il parametro da passare in per riferimento in modo da poter aggiornare il valore.
Public Function GetNextNonDuplicateNumber(ByRef NonDupeNumber as Long) as Boolean