php - tipos - InvalidArgumentException vs UnexpectedValueException
php try catch exception getmessage (3)
¿Cuándo debería usar InvalidArgumentException y cuándo UnexpectedValueException ? Lucen iguales para mi.
Note que uno extiende LogicException y el otro extiende RuntimeException, por lo que la diferencia no debe ser tan sutil IMO.
Mirando de cerca las descripciones en las páginas del manual:
InvalidArgumentException:
Excepción lanzada si un argumento no coincide con el tipo esperado.
(Nota: "tipo" era originalmente "valor" en la página del manual, lo que lo hace más una cuestión de validación que la verificación de tipo y más se aproxima a la terminología de UnexpectedValueException).
UnexpectedValueException:
Excepción lanzada si un valor no coincide con un conjunto de valores. Por lo general, esto ocurre cuando una función llama a otra función y espera que el valor de retorno sea de un cierto tipo o valor [,] sin incluir los errores aritméticos o relacionados con el búfer.
A partir de esto, podemos concluir que InvalidArgumentException
está destinado a los argumentos pasados a una función, mientras que UnexpectedValueException
está destinado a los valores que surgen durante los cálculos internos de una función (por ejemplo, valores devueltos por otras funciones).
Supongo que la mayor diferencia es "argumento" vs "valor".
La forma en que lo veo es que InvalidArgumentException
es para argumentos (pasados), mientras que UnexpectedValueException
aplica a valores (devueltos). También hay una diferencia sutil pero importante entre "no válido" e "inesperado", lo que también explica por qué la primera es LogicException y la segunda, RuntimeException.
Por ejemplo: supongamos que tengo una función que utiliza la API de Twitter llamada: getLastMessageDate($userid)
: se pasa una ID de usuario (numérica) y se devuelve la fecha del último mensaje de ese usuario como aaaa-mm- dd cadena.
Ahora, supongamos que llamo a esta función con una cadena como argumento en lugar de un número. En este punto, puedo llamar a InvalidArgumentException, porque el argumento proporcionado no es válido para esta función. Estas verificaciones se pueden hacer por lógica , porque una variable es numérica o no lo es. Por lo tanto, es una LogicException.
Sin embargo, el valor de retorno de una función puede no ser verificable por lógica, especialmente cuando se trata de contenido dinámico (de terceros). Porque nunca se puede saber exactamente qué función va a devolver. (si lo hiciera, podría argumentar que su función sería inútil).
Entonces, esta vez llamo a mi función con un ID de usuario (válido) y mi función obtiene la fecha del último mensaje de ese usuario. Con esta fecha me gustaría hacer algo, como algún formato.
Ahora imagine que los chicos de Twitter hicieron algo mal y, en lugar de la cadena de fecha yyyy-mm-dd esperada , recibo una cadena vacía o una cadena diferente que dice ''blaaaa''. En este punto, puedo lanzar una UnexpectedValueException
.
No puedo decir que este valor sea "Inválido" - Pedí una cadena y obtuve una cadena. Pero, sin embargo, no es el "tipo de cadena" que esperaba: por lo tanto, la ValueException no esperada.
Espero que esto aclare algo. Esta es mi primera publicación, hasta ahora he aprendido que escribir lo que tengo en mente no es lo más fácil (también el inglés no es mi lengua materna).
Tengo entendido que InvalidArgumentException
, al ser una LogicException
, se debe usar si se LogicException
un argumento con una lista fija de posibles rangos de valores. Por ejemplo, verificar si el usuario ingresó datos contiene solo números. Se puede esperar que la lógica del programa maneje estos rangos de valores.
UnexpectedValueException
, al ser una RuntimeException
( errores que solo se pueden encontrar en tiempo de ejecución / no se pueden detectar en tiempo de compilación ), se usaría para Excepciones que ocurran fuera de rangos de entrada predecibles y especificados (posiblemente como último recurso después de las verificaciones "lógicas" anteriores )
La clave para responder a esta pregunta podría ser lo Unexpected...
en UnexpectedValueException
. Unexpected
significa que no hay manejo para este valor en la lógica del programa. Invalid
, por otro lado, sugiere que se haya manejado este valor.