tipos - php try catch exception getmessage
OutOfRangeException vs. OutOfBoundsException (6)
PHP define dos excepciones SPL para claves inválidas:
OutOfRangeException
: Excepción lanzada cuando se solicitó un índice ilegal. Esto representa errores que deberían detectarse en tiempo de compilación.
OutOfBoundsException
: Excepción lanzada si un valor no es una clave válida. Esto representa errores que no se pueden detectar en tiempo de compilación.
Como PHP no es un lenguaje compilado, la distinción entre el tiempo de compilación y el tiempo de ejecución parece extraño, por lo que me cuesta entender qué excepción utilizar cuando.
Actualmente mi entendimiento es que uno debe lanzar ...
... OutOfRangeException
si la clave está malformada de forma fundamental e inherente, por ejemplo, si una matriz se pasa como una clave.
... OutOfBoundsException
si la clave está generalmente bien, pero no está en algunos límites, por ejemplo, si se pasa 100
pero 50
es la clave máxima.
Es ese entendimiento correcto?
- Si obtienes un índice inesperado es decir, espera una
string
pero termina con uninteger
o viceversa. Entonces debería lanzar una excepción de excepción de origenUnexpectedValueException
. - Si obtiene un tipo adecuado de índice, pero no existe. Luego,
(trigger_error)
unawarning
(trigger_error)
y continúe. No se espera que esto detenga el flujo de programación. - Si tiene un objeto que es iterable o se supone que debe repetirse en un rango y alcanza su límite (es decir, el final de un archivo), debe lanzar
OutOfBoundsException
. - Cualquier otra cosa es un candidato para
OutOfRangeException
.
En términos simples. Una OutOfBoundsException
es algo normal. No es tan serio. Es algo que sucede a menudo y debe ser atendido. puede ser utilizado por iteradores para seguir leyendo datos hasta que ya no haya más que leer. Es un error logico Hecho por alguien que usa el código, no por alguien que escribe el código.
Una OutOfRangeException
es algo serio. Alguien debería mirar el código fuente. Alguien debería descubrir lo que sucedió. Esto es importante. En teoría, esto nunca se suponía que sucediera. Llame al 911. Es un error de tiempo de compilación. Hecho por el programador ficticio.
Las excepciones fuera de rango las escriben los programadores para evitar errores de otros programadores. O tal vez usted mismo en el futuro. Si sientes que algo así nunca podría suceder, utiliza Out Of Range. Use Out of Bounds para algo que pueda suceder.
Es bastante simple:
OutOfRange significa "Su clave solicitada no está dentro del índice de un conjunto definido en el código ".
OutOfBounds significa "Su clave solicitada no está dentro del índice de un conjunto definido por la configuración cargada ".
La confusión en este caso proviene de un par de factores. Primero, PHP está de hecho compilado en bytecode. Hay varios entornos de ejecución donde este formulario compilado persiste de forma relativamente permanente en el servidor. Sin embargo, el problema OutOfRangeException / OutOfBoundsException no se trata de eso, se trata de un error de categorización realizado por las personas que documentaron estas clases de excepciones específicas.
Dado que PHP se tipea dinámicamente, a menudo es imposible verificar los rangos e incluso los tipos en el momento de la compilación. El manual establece que OutOfRangeException se debe generar en tiempo de compilación y OutOfBoundsException debe aplicarse en tiempo de ejecución, lo cual es una distinción errónea en este contexto.
Ambas entradas manuales utilizan un lenguaje poco claro de lo que significa un índice ilegal, pero analizar el uso de sus clases principales da algunas pistas: las excepciones LogicExceptions se amplían por clases como DomainException, InvalidArgumentException y LengthException, mientras que las excepciones de Runtime son tales como UnexpectedValueException, OverflowException y UnderflowException. A partir de este patrón, se puede inferir que OutOfRangeException probablemente debería aplicarse a tipos de clave ilegales, y OutOfBoundsException debería aplicarse a valores de índice que son del tipo correcto pero no están dentro de los límites de su contenedor.
Hubo una discusión sobre la lista de desarrolladores de PHP acerca de que estas categorizaciones son incorrectas, pero el problema es más profundo que eso. En la práctica, ambas excepciones solo pueden surgir realmente en tiempo de ejecución. Puede utilizar los caprichos de la documentación para exprimir una distinción entre tipos de clave no válidos y valores de índice no válidos, pero en este punto estamos hablando de un error en la documentación de PHP.
La respuesta a su pregunta es bastante elusiva para mí también. Sin embargo, aquí hay algunas cosas para pensar:
- Si se transfiere una matriz cuando esperamos una clave de matriz válida, también tenemos
InvalidArgumentException
porque no es el tipo de argumento adecuado. - También podríamos arrojar una
DomainException
porque las matrices no están en el dominio para las claves de matriz. - En php, generalmente no puede detectar tipos en tiempo de compilación debido a la vinculación estática tardía. Retrasan deliberadamente el enlace de variables al tiempo de ejecución.
Cómo manejo esta situación:
- Lanza una
InvalidArgumentException
si una variable se pasa a cualquier función donde el argumento no es del tipo correcto. Todavía hago esto cuando trabajo con matrices. - Lanza una
InvalidArgumentException
si se pasónull
cuando no debería ser. Este realmente podría ser un montón de cosas porque null no está escrito. Para mantener la verificación del código de error simple, simplemente me quedo con el argumento inválido. - Tire
OutOfBoundsException
cuando un índice no esté en el rango correcto, tal como lo sugirió. - Tire
BadFunctionCallException
si una función proporcionada por el usuario como parámetro no tiene la forma correcta. Si su estructura interna es una matriz, tiene sentido que puedan pasar una función para modificarla, por lo que esto aparece ocasionalmente.
Generalmente, puedo usar solo estas tres excepciones para representar todos los errores que ocurren fuera de los recursos especiales (las conexiones de red y de base de datos serían recursos especiales). El tercero parece haber estado apareciendo con más frecuencia, pero principalmente he tratado con los dos anteriores.
Mi propia opinión sobre esto es:
LogicException
utilizar para cualquier error que el desarrollador hizo, por ejemplo, errores al programar / ensamblar la aplicación. Es de esperar que los atrape cuando el desarrollador ejecuta sus UnitTests (que sería el equivalente al Tiempo de compilación). Esas excepciones nunca deberían ocurrir en el sitio de producción ya que son errores en el software como tal.
RuntimeException
:
utilícelo para cualquier error que haya cometido el usuario o que resulte de datos no válidos ingresados en la aplicación en tiempo de ejecución. Estos son errores que pueden anticiparse pero que no pueden evitarse por completo con UnitTests, por ejemplo, pueden ocurrir en un sitio de producción. Esas excepciones podrían deberse a un uso incorrecto o errores de programación.
OutOfBounds
es IMO efectivamente lo que Wikipedia define como Rango de una matriz en el rango de programación de computadora , a saber:
Cuando una matriz se indexa numéricamente, su rango es el límite superior e inferior de la matriz. Dependiendo del entorno, se producirá una advertencia, un error fatal o un comportamiento impredecible si el programa intenta acceder a un elemento de la matriz que está fuera del rango.
En otras palabras, cuando tienes una matriz con índices [0,1,2] cualquier cosa menos [0,1,2] está fuera de límites. Tenga en cuenta que los límites también se pueden aplicar a otros tipos de datos, por ejemplo, tratar de acceder al séptimo personaje en una cadena de 5 caracteres también sería OutOfBounds.
OutOfRange
:
esta es una galleta dura En C ++ OutOfRange es una excepción genérica que extiende LogicException (como en PHP). No estoy seguro si el ejemplo dado es fácilmente traducible a código PHP o mi definición de Tiempo de compilación arriba. Principalmente porque nadie primero iniciará un new Vector(10)
e inmediatamente intentará acceder a él at(20)
.
En Java OutOfRange
parece referirse a Rango en el sentido matemático
El rango de una función son los posibles valores y de una función que resultan cuando sustituimos todos los posibles valores x en la función.
Sin embargo, una reference que pude encontrar es que amplía RuntimeException, así que supongo que buscar en otros idiomas no ayudará a resolver este misterio. También hay un informe de error abierto sobre las Excepciones de SPL en general , que establece que
- OutOfRangeException (el valor está fuera de rango) es LogicException, debe ser: RuntimeException
Pero si esto es correcto, ¿cómo es diferente OutOfRange de DomainException? Y si su propia definición es correcta, ¿cómo es diferente InvalidArgumentException
de InvalidArgumentException
?
Para abreviar: no sé para qué se supone que OutOfRangeException
es.
Si bien PHP no tiene un "tiempo de compilación" clásico (o un compilador que hace un montón de comprobaciones estáticas para el caso), trataría el "tiempo de compilación" como "cosas bastante estáticas que hice mal al escribir el código" y " tiempo de ejecución "como" mi lógica, entrada o validación estaba desactivada en algún momento ".
Entonces mi sugerencia sería tratarlo así:
"Compile Time" / "OutOfRangeException"
: el error siempre se puede "Compile Time" / "OutOfRangeException"
en el código fuente sin o con muy poca lógica.
Siempre tomo los números del 1 al 10 y me pones 11
"Run Time" / "OutOfBoundsException"
: el error se debe a un uso incorrecto en el tiempo de ejecución.
Me creaste y me dijiste que tomara valores de 1 a 5 y luego ingresaste 7. No computa
o
Solicitas un índice que no está allí porque no lo pusiste allí como deberías
Muestra:
Esperaría que SplFixedArray arrojara una OutOfBoundsException
porque su tamaño es dinámico y puede OutOfBoundsException
en tiempo de ejecución, mientras que yo esperaría que arroje algo como Calender::getMonthName
y OutOfRangeException
porque el número de meses definitivamente se fija en "compilar / escribir" hora.
Muestra de objeto de matriz:
Say $ array es un objeto que implementa ArrayAccess, podría arrojar una OutOfBoundsException
en estas circunstancias:
$array[''bar''];
$array[7];
Como los valores son los que podría esperar para ArrayAccess, pero no tiene sentido en el caso de SplFixedArray (5). Las alternativas serían DomainException
o quizás RangeException
Una OutOfRangeException
en estos casos:
$calendar->getMonth(15);
Como poner una matriz o una nueva clase definitivamente hay un error lógico mayor en el código que generalmente resulta de un error simple de "oh, puse la variable incorrecta" por un programador. Una alternativa (quizás preferible) sería UnexpectedValueException
y una buena antigua InvalidArgumentException
.
Para casos como:
$array[array()];
$array[new StdClass];
algunas de las excepciones alternativas parecen más adecuadas.
Las comparaciones con el mundo de Java en el que se aplica la excepción no siempre son aplicables ya que los Desarrolladores de Java tienen un problema de adiciones que resolver.
Excepciones controladas / sin marcar. Dado que muchas personas argumentan que todo lo que no es una excepción de tiempo de ejecución tiene un uso muy limitado en Java / no debería usarse mucho internamente, esos nombres han perdido parte de su significado e intención original.