Pregunta

Dame algunos de tus pensamientos sobre cuál es una mejor práctica de codificación / hace que el código sea más eficiente / se ve más bonito / lo que sea: ¿Aumentar y mejorar tu capacidad de usar declaraciones if para anticipar y detectar posibles problemas? ¿O simplemente haciendo un buen uso de try / catch en general?

Digamos que esto es para Java (si es importante).

Editar: Actualmente estoy haciendo la transición lejos de algunas prácticas de codificación actuales ciertamente obsoletas y restringidas, pero estoy un poco desgarrado por la necesidad de hacerlo en algunos puntos (tales como esto) Simplemente estoy pidiendo algunas perspectivas sobre esto. No es un debate.

Otros consejos

Los bloques

if son un poco más rápidos; Si no va a necesitar una docena de ellos, es una mejor idea que try / catches . Las excepciones deben ser excepcionales, no cada vez que se ejecuta el código. Uso Excepciones para eventos raros como desconexiones del servidor (aunque suceden varias veces al día) y if bloquea cualquiera de mis variables controlables.

Independientemente del código que esté escribiendo, terminará usando ambos. No puedo hablar por el tiempo de ejecución de Java, pero en el tiempo de ejecución de .NET hay un golpe de rendimiento asociado con el uso de bloques try-catch. Como resultado, trato de usarlos solo en áreas donde tengo una manera clara de manejar la excepción una vez detectada (incluso si solo está registrando la existencia de un problema).

Si se encuentra utilizando muchos bloques try-catch o if-else en su código, o sus métodos tienden a ser bastante largos, considere refactorizar el código en una mayor cantidad de métodos más pequeños. La intención de su lógica será más fácil de seguir, así como también más fácil de realizar pruebas unitarias.

Creo que si las declaraciones son mejores. No puedes rodear cada línea de código con un try..catch (bueno, puedes pero no debes hacerlo). Puede rodear un bloque de código con try catch pero no todas las líneas.

Y las excepciones ralentizan las cosas.

Mi 2p: Usar try / catch es mejor:

  • deja absolutamente claro a otros codificadores que está haciendo un manejo de excepciones
  • el compilador comprende lo que está haciendo y puede realizar comprobaciones en tiempo de compilación más apropiadas para usted

En mi experiencia, usar if-conditional-logic hace que sea más difícil distinguir el manejo de errores de la lógica de negocios.

De lo que me han dicho desarrolladores y analistas más experimentados, try / catch está más orientado a objetos y, si es más procesal,

Personalmente no me importa.

Soy consciente del hecho de que un try / catch es más lento y causa un impacto en el rendimiento, pero si voy a usar una docena de ifs para validar antes de poder hacer lo que quiero hacer, siempre usaré un intento / captura para ahorrar en la cantidad de líneas de código.

Hace mi vida mucho más fácil no tener que validar nada y si la declaración falla, simplemente haz lo que hubiera hecho en mi bloque 'else' ... en mi bloque 'catch'.

A veces, obviamente adjunto algunas declaraciones if en un try / catch, pero de todos modos.

Utilizo un if cuando solo hay un pequeño número de cosas para validar (1 o 2) antes de hacer lo que tengo que hacer.

Hay una cosa que no se ha mencionado aquí.

Con una instrucción if-else, cada vez que se ejecuta el código, se garantiza que al menos 1 de la condición se evaluará ejecutada. Estoy seguro de que todos sabemos cómo funciona un if-else-elseif, pero para ser claros ... la parte if de la declaración siempre se evaluará, si es falsa, entonces el siguiente else-if se evalúa, y así sucesivamente hasta que solo quede el else para evaluar.

Por lo tanto, usar una instrucción if-else afectará su rendimiento. No significativamente (en la mayoría de los casos), pero lleva tiempo de CPU realizar las evaluaciones.

declaraciones try-catch, y corrígeme si me equivoco, no te consideren en tiempo de ejecución hasta que sean necesarias (es decir, se lanza una excepción). Por lo tanto, simplemente envolver su código en un try-catch no afectará el rendimiento hasta que realmente se detecte una excepción.

Además, no es la captura lo que causa el impacto en el rendimiento, sino el lanzamiento.

Y un punto importante a destacar es que las declaraciones try-catch NUNCA deben usarse para lógica condicional. Solo deben usarse para lo que están diseñados: ¡manejo de excepciones!

Capturar excepciones es esencial, si sabe qué hacer con ellas. Si no tiene forma de manejar adecuadamente la excepción, entonces debe dejarla pasar, ya que algunos códigos más arriba de la cadena pueden tener una mejor manera de manejarla.

Suele ser una buena idea tener un gestor de excepciones en el nivel superior absoluto de su aplicación para detectar excepciones antes de que el usuario las vea. En ASP.NET puede hacer esto en el evento Application_Error del global.asax. En otros idiomas / entornos, lo haría en su ciclo principal, sea lo que sea.

Pero tenga en cuenta que hay algunas excepciones que siempre es mejor no detectar. A veces, cuando ocurre una excepción, es un indicador de que el estado de su aplicación se ha visto gravemente comprometido y no se puede confiar en él. Lo único seguro es matar y reiniciar.

@PersonalPerson - Lo siento, pero esto es solo una codificación perezosa. En lugar de usar un try-catch porque hay demasiadas declaraciones if, ¿por qué no refactorizar su código (es decir, poner su lógica de validación en su propio método)? Esto mantendrá su código más limpio y más legible y mantendrá las mejores prácticas para el rendimiento.

Nunca intentes escribir tu código para lograr el menor número de líneas. Esto siempre terminará mal. Claro que puedes encontrar una forma más elegante de escribir algo que tus amigos codificadores puedan escuchar, pero eso hace que las cosas sean menos legibles.

Lo juro, he trabajado con su código antes, y me dolía la cabeza.

El uso de excepciones es un método universal para notificar a otra parte del código que algo incorrecto sucedió de manera poco flexible. Imagine que si desea manejar alguna condición excepcional usando if ... nad else ... necesita insertar en diferentes partes de su código algunas variables arbitrarias y otras cosas que probablemente conducirían fácilmente a tener un código de espagueti poco después.

Imagine a continuación que está utilizando una biblioteca / paquete externo y su autor decidió poner en su código otra forma arbitraria de manejar estados incorrectos, lo que lo obligaría a adaptarse a su forma de tratarlo, por ejemplo necesitaría verificar si métodos particulares devuelven verdadero o falso o lo que sea.

El uso de excepciones hace que el manejo de errores sea mucho más fácil: simplemente asume que si algo sale mal, el otro código arrojará una excepción, por lo que simplemente envuelve el código en el bloque de prueba y maneja la posible excepción a su manera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top