El sufijo Excepción sobre excepciones en java

19

Especificar un sufijo de Excepción en las clases de excepción me parece un olor a código (Información redundante: el resto del nombre implica un estado de error y hereda de Excepción). Sin embargo, también parece que todos lo hacen y parece ser una buena práctica.

Estoy buscando entender por qué esta es una buena práctica.

Ya he visto y leído la pregunta por qué las excepciones suelen tener la excepción de sufijo en el nombre de la clase

La pregunta es para PHP y, si bien las respuestas son probablemente válidas para Java. ¿Hay otros argumentos o es realmente tan simple como diferenciarlos explícitamente?

Si tomamos los ejemplos de la pregunta anterior, ¿podría realmente haber clases en Java con el nombre FileNoFoundque no sea una excepción? Si pudiera haberlo, ¿merece sufijo Exception?

Mirando una jerarquía rápida en eclipse de Exception, efectivamente, la gran mayoría de ellos tienen el sufijo de excepción, pero hay algunas excepciones. javassistes un ejemplo de una biblioteca que parece tener algunas excepciones sin el sufijo, por ejemplo BadByteCode,BadHttpRequest etc.

BouncyCastle es otra lib con excepciones como CompileError

También busqué en Google un poco con poca información sobre el tema.

drone.ah
fuente
2
"¿Deberían todas las excepciones llevar un Exceptionsufijo, o deberíamos hacer excepciones para excepciones excepcionales?" ;)
tdammers
2
En realidad es como un error de excepción (ver OutOfMemoryError), sino que son para las cosas que son difíciles de recuperarse de (por lo que casi nunca tratar con ellos)
monstruo de trinquete
1
Además, he oído que, como regla general, "las clases deberían ser sustantivos y los métodos deberían ser verbos (acciones)". FileNotFound ArrayIndexOutOfBoundsy OutOfMemoryson más observaciones / descripciones, pero luego se aplican al sustantivo Exception.
MikeTheLiar

Respuestas:

27

La respuesta de Landei es buena, pero también está la respuesta gramatical. Los nombres de las clases deben ser sustantivos . ¿Qué es un "OutOfMemory"? ¿Qué es un "FileNotFound"? Si piensa en "Excepción" como el sustantivo, entonces el descriptor es el adjetivo que lo especifica. No es cualquiera Exception, es un FileNotFoundException. No debería necesitar atrapar OutOfMemorymás de lo que iría a la tienda a comprar un "azul".

Esto también aparece si lee su código como una oración: " Tryhaciendo ... y catch OutOfMemory Exceptions"

Bobson
fuente
1
Para citar el artículo "Trate de usar sustantivos porque una clase normalmente representa algo en el mundo real". ¿Pero las excepciones caen en este caso? Para mí, son más como un artefacto de programación, que representa un mensaje de error. "Obtendrá una OutOfMemoryexcepción" se lee mejor que "Obtendrá una OutOfMemoryExceptionexcepción", ¿no?
greg0ire
1
@ greg0ire: deberías probarlo como "Obtendrás un OutOfMemoryException". Dicho esto, también tenemos números PIN y cajeros automáticos, por lo que una excepción OOME no sería tan inusual.
Bobson
Creo que el punto que está haciendo aquí es realmente el mejor (el de los conflictos de nombres ya no se mantiene gracias a los espacios de nombres, al menos en php). Tengo más cosas que decir sobre todo esto, y publicaré una respuesta pronto.
greg0ire
¡Hecho! ¿Qué piensas?
greg0ire
@Bobson Recomiendo leer El reino de los sustantivos . No necesitamos que todo sea un sustantivo. ¿Por qué "obtendrá un OutOfMemoryException" cuando simplemente puede ser "no tiene memoria"? No utilizamos Classsufijos ( DogClass, CatClass, XmlReaderClass, ...).
Matthieu Napoli
6

Creo que las excepciones (y los errores, y en teoría otros Throwable) son diferentes de cosas como interfaces o enumeraciones (que generalmente no se usan como sufijo): generalmente tienen un propósito muy claro y limitado, se usan con construcciones de lenguaje especializadas ( try, catch` throw`throws ) y seguir las reglas especiales (por ejemplo comprobado vs excepciones sin marcar, no hay genéricos). En cierto modo, no son solo clases que se utilizan como excepciones, sino un mecanismo de excepción que se implementa por medio de clases.

Entonces, si está lidiando con una excepción y no la reconoce como tal, por lo general, algo está profundamente mal (lo cual nuevamente no es el caso para cosas como enumeraciones o interfaces). Así que creo que estas diferencias con las clases "normales" son lo suficientemente grandes como para requerir una pista visual.

Landei
fuente
1
Me suena contradictorio. Si las excepciones son tan especiales y se usan de manera especial y tan evidentemente reconocibles, ¿por qué necesita una pista visual?
Michael Borgwardt
@MichaelBorgwardt: creo que está diciendo que debido a que son especiales y se usan de manera especial, deberían tener la pista visual para ser obviamente reconocibles. Dicho esto, no sé si incluso puedes lanzar algo que no se hereda de ExceptionJava, no puedes hacerlo en C #. Si no puede, entonces no puedo pensar en un escenario en el que estaría "lidiando con una excepción y [no] reconocerla como tal".
Bobson
Tampoco puedes lanzar non- Throwables en Java. Sin embargo, puede lidiar con la excepción no solo en la configuración try- catch, por ejemplo, puede recopilar excepciones cuando realiza algún tipo de validación para objetos complejos (cuando desea conocer todos los problemas relacionados, no solo el primero). En tales casos, debe tener en cuenta que puede, por ejemplo, volver a tirar las cosas que tiene en su lista, por lo que sería malo llamarlas, es decir, en ValidationIssuelugar de ValidationException.
Landei
0

Sin embargo, también parece que todos lo hacen y parece ser una buena práctica.

Sí, todo el mundo lo hace, así que es una práctica, pero ¿sigue siendo bueno? Varias personas se preguntan que:

  • http://mnapoli.fr/approaching-coding-style-rationally/ (El sufijo de excepción § contexto: php)
  • El video vinculado, https://vimeo.com/album/2661665/video/74316116 (salte a 53:00, contexto: php), inspira el artículo y señala que cada vez que usa una excepción, tiene una palabra clave eso ya muestra que es una excepción cerca
  • http://verraes.net/2013/10/verbs-in-class-names/ muestra cómo la declaración en la respuesta de @Bobson podría no ser absoluta, y señala que a veces el sufijo es bueno, para su aplicación o excepciones de nivel de infraestructura, y a veces debe intentar guardar los caracteres tomados por este sufijo largo para expresar algo más preciso y significativo. Este punto solo tiene sentido si usa un idioma donde la cultura es usar excepciones para infracciones de las reglas de negocios.
  • el enlace SO que proporciona hace puntos sobre conflictos de nombres, pero ahora, tenemos espacios de nombres, ¿no?
greg0ire
fuente
Esta es una pregunta de Java , no una pregunta de PHP . Los modismos son diferentes entre los idiomas. Dicho esto, estoy totalmente en desacuerdo con esta cita de su tercer enlace: "Las excepciones pueden ser similares a los eventos, ... con el matiz de que es un evento indeseable, una advertencia de que alguna operación era inconsistente con, por ejemplo, las reglas comerciales que están en vigor ". Quizás PHP es diferente sobre esto, pero en mi opinión, se supone que las excepciones son excepcionales. Si se viola una regla de negocios de la manera esperada, su lógica normal debería manejarla, no es una excepción al comportamiento normal.
Bobson
Puede tener razón en que varía según el idioma por idioma: vea este hilo sobre python: gossamer-threads.com/lists/python/python/796627 . php y python claramente no están enfocados en el rendimiento, quizás por eso existe esta diferencia con java (que está enfocado en el rendimiento, ¿verdad?). Si tiene varias capas para cruzar en su pila de llamadas antes de estar en el nivel correcto para manejar la violación de las reglas de negocio correctamente, las excepciones son la mejor OMI. También hace que los tipos de retorno sean más consistentes (devuelve siempre el mismo tipo, no falso o verdadero).
Editaré