Atrapar, manejar y luego volver a lanzar ¿Excepción?
-
20-08-2019 - |
Pregunta
Hoy me encontré con un interesante dilema. Tengo una función que maneja la información y verifica los valores duplicados, luego devuelve el siguiente número que no es un duplicado. Entonces, tengo algo como esto:
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
Luego, en la parte inferior de la función, tengo un bloque catch que maneja el duplicado incrementándolo hasta que ya no tengo un duplicado, como este:
Catch ex as DuplicateException
NonDuplicate = IncrementToNonDuplicateValue(NumberToCheck)
Throw ex
Return NonDuplicate
End Function
Como puede ver, quiero manejar la excepción específicamente, pero también quiero lanzarla cuando termine porque quiero alertar a otro código fuera de la función.
El problema es que simplemente arrojarlo sale de la función con un valor null
. ¿Estoy pensando en un try/catch
de forma incorrecta, o hay alguna forma de evitarlo?
Solución
Si captó una excepción y se recuperó de ella (con su IncrementToNonDuplicate ...), entonces ya no hay razón para lanzar una excepción. El código entre catch y end try solo debe limpiar los recursos como cerrar un archivo o un lector de datos si lo va a volver a lanzar.
Preferiría devolver una estructura que contenga un valor no duplicado y la información requerida sobre los errores en la función. Otra forma sería lanzar una excepción personalizada que contendrá información como & Quot; Número inválido: debería ser ...)
Otros consejos
Puede devolver un valor booleano que indique si se encuentra un duplicado y cambiar el parámetro que se pasará por referencia para que pueda actualizar el valor.
Public Function GetNextNonDuplicateNumber(ByRef NonDupeNumber as Long) as Boolean