Elio Alejandro Marcano Brito
Elio Alejandro Marcano Brito
traído desde:
Ronnie Moncayo
Excelente aporte!
¿Cómo controlar y manejar excepciones con bloques de código?
Hablar de excepciones en programación puede parecer complejo, pero no tiene por qué serlo. Las excepciones son una parte crucial para mantener nuestros sistemas a salvo de errores y permitir una respuesta controlada ante situaciones imprevistas. En este contenido, exploraremos cómo manejar estas excepciones usando bloques de código específicos y entenderemos el mecanismo detrás del manejo de excepciones en Java.
¿Qué es un bloque de código try-catch-finally?
Un bloque try-catch-finally es una estructura fundamental para el manejo de excepciones en Java. Este se utiliza para evitar que los errores interrumpan el flujo normal de nuestros programas.
Try: Dentro de este bloque se coloca todo el código que podría ser susceptible de generar una excepción. Es aquí donde el compilador de Java puede requerir la inclusión del bloque try si identifica código potencialmente problemático, como operaciones de E/S o conexiones a bases de datos.
Catch: Si una excepción ocurre dentro del bloque try, el flujo del programa se mueve al bloque catch. Aquí es donde se manejan las excepciones de manera específica, permitiendo gestionar distintos tipos de errores de forma individualizada o de manera genérica con la clase Exception.
try { // Código que puede lanzar una excepción } catch (TipoDeExcepcion e) { // Manejo de la excepción }
Finally: Este bloque es opcional, pero es recomendable incluirlo, ya que asegura que el código dentro de él se ejecute siempre, sin importar si ocurrió una excepción. Suele utilizarse para liberar recursos, como cerrar archivos o conexiones, asegurando así la limpieza y eficiencia de los recursos del sistema.
¿Qué es try with resources y por qué es útil?
La estructura try with resources nació para resolver de una forma más eficiente el manejo de recursos en Java, introducida en Java 7 y mejorada en versiones posteriores. Su propósito es simplificar el cierre automático de recursos, lo que solía hacerse dentro del bloque finally.
Automatización del cierre de recursos: Con esta estructura, se declara el recurso dentro del paréntesis del bloque try, y el sistema automáticamente lo cierra al finalizar el bloque. Esto elimina la necesidad de escribir código redundante para gestionar recursos dentro de finally.
try (BufferedReader br = new BufferedReader(new FileReader("archivo.txt"))) { // Manejo del archivo } catch (IOException e) { // Manejo de excepciones }
Mejoras en Java 9: Una de las mejoras introducidas en Java 9 fue eliminar la necesidad de declaración previa de variables auxiliares para los recursos, simplificando así el código y reduciendo la posibilidad de errores.
¿Cómo utilizar la sintaxis del bloque try catch with resource?
El uso de try with resources no solo es útil, sino que se ha convertido en una práctica recomendada, especialmente cuando se trabaja con recursos que requieren apertura y cierre, como conexiones a bases de datos, flujos de entrada/salida, y mucho más.
Un ejemplo básico de su sintaxis sería:
try (Connection connection = DriverManager.getConnection(url, user, password)) { // Trabajo con la conexión a la base de datos } catch (SQLException e) { // Manejo de errores de SQL }
En resumen, el manejo de excepciones mediante bloques try-catch-finally y try with resources no solo mejora la calidad del código, sino que también asegura que nuestros programas sean más seguros y eficientes. ¡Así que no dudes en implementar estas técnicas en tus proyectos y explorar sus potenciales más allá de la teoría! Aprende, experimenta y, lo más importante, diviértete codificando.
Si tienes más ejemplos o necesitas aclaraciones adicionales, deja tus comentarios y participa en el aprendizaje colectivo con tus compañeros. Cada pregunta y contribución agrega valor y enriquece esta experiencia de aprendizaje. ¡Sigue adelante y nunca dejes de aprender!
Elio Alejandro Marcano Brito
Elio Alejandro Marcano Brito
traído desde:
Ronnie Moncayo
Excelente aporte!
Vespaciano Forero Sanchez
Cuando hay una división con denominador 0.
public class Hola { public static int numerador = 10; public static Integer denominador = 0; public static float division; public static void main(String []args) { try { division = nuemrador / denominador; } catch (AritmeticException e) { division = 0; System.out.println("Error "+e.getMessage()); } } }
irwin laguado
Excelente 👍
LUIS DAVID MEDINA GAVIRIA
Mal estoy en esos momentos donde nose que es lo que estoy haciendo, entre mas avanzo menos sentido me encuentro 😕
¿ es eso normal ?
Hugo Enrique Barrera Ortega
A mi hasta hace poco me sucedía lo mismo sin embargo comencé a apoyar en mi trabajo como desarrollador y me di cuenta que lo que había aprendido en los cursos agarraba forma dentro de un proyecto oficial.
Es importante saber que tomar clases es solo el 50% del trabajo para aprender realmente, el otro 50% es por practicas y proyectos que tu vayas realizando poniendo en función todo lo aprendido en las clases.
Luis David López Berber
No te desanimes, recuerda que puedes ir descargando los avances del código en cada video, repítelos hasta que entiendas que es lo que estamos haciendo, suerte.
Luis Cristóbal Oliden Albrecht
Braian Peña
Buen resumen gracias por el aporte.
Pro Code
Es correcto OLIDE858, lo desfavorable de solo utilizar try y finally omitiendo cualquier catch, es que no capturaríamos el error y por lo tanto podría tomar más tiempo en hallar la solución.
Noe de Jesus Muñoz Martinez
Norman Erick Estrada Vargas
buen aporte!!!
Yossijaki Jorge Astilleros Chávez
Excelente aporte!
Diego A de la Cruz Rojas
Leonel Soto Nuñez
le comparto esta información para reforzar lo aprendido
Yeferson Nova
Daniel Velazquez Villegas
Try-with-resources
Cristian Gómez
Cuando un método es susceptible a un error, se usa el try - catch o incluso para cualquier linea de código es buena practica que siempre esté dentro de un try - catch, estos errores o exceptions se verán reflejados en el cliente, por ende se deben imprimir o entregar como información HTTP, y para esto hay una asignación 'throw exception' que se debe insertar en los métodos que sean llamados por otras clases o por la clase principal que ejecuta, así siendo apto el método para lanzar las errores y la clase que ejecuta pueda capturarlos.
César Espitia
Luis Enrique Henao Rodriguez
La clausula throws como se maneja especificamente?
Marco Bottino Poittevin
Hola, "throws" se utiliza para declarar una excepción que puede ocurrir en un método. Te dejo algunos links que me ayudaron a entenderlo mejor.
https://www.javatpoint.com/throws-keyword-and-difference-between-throw-and-throws https://www.w3schools.com/java/ref_keyword_throws.asp
Saludos.
Carlos Uriel de Jesus Sánchez González
un ejemplo de try-with-resources es este método que uso para descargar archivos desde un jsp (Web)
response.setHeader("Content-Disposition", "attachment;filename=" + archivoNOMBRE); try (InputStream is = new FileInputStream(RUTAARCHIVO); OutputStream os = response.getOutputStream()) { byte[] bytes = new byte[4096]; int leidos; while ((leidos = is.read(bytes)) != -1) { os.write(bytes, 0, leidos); } }
Rodrigo Damián Martinez
clona desde HTTPS, con SSH no pude
Antonio Madrid
Sobre el minuto 6 no se ve bien el código ya que el logo de Platzi lo tapa.
Diego Forero
Team PlatziGracias, ya esta reportado vamos a trabajar en la edición del video para solucionar esto.
Elio Alejandro Marcano Brito
public static void main (String[] args) { String cadena = “1234”; int numero; try { numero = Integer.parseInt(cadena); System.out.println(“Dato convertido” + numero); } catch (NumberFormatException e) { division = 0; System.out.println(“No es un numero es una cadena”); } } traído de: https://www.youtube.com/watch?v=iFcVmezVw84```
Hernan Maza
Encontré un caso especial de uso detry catch with resources dentro de un método, se obvia la declaracion del catch en lugar de ello se lo coloca en la declaracion del metodo
throws IOException```
static String readFirstLineFromFile(String path) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } }```
Braian Peña
Muy interesante lo que se va añadiendo en las versiones de java.
William Schnaider Torres Bermon
Podráne encontrar mucha más información aquí. Por cierto, les recomiendo los post y tutoriales de baeldung.
Digneli Mariet Dávila Ramones
Interesting, Thank u for the information.
Cuando quieres convertir una cadena a un número.
public static void main(String[] args) { String cadena = "Hola"; int numero; try { numero = Integer.parseInt(cadena); } catch(NumberFormatException e) { System.out.println("No es un número es una cadena"); } }
public static void main(String[] args) { String fileName = "C:/test.txt"; try { ReadFile file = new ReadFile(fileName); String[] arrayLines = file.OpenFile(); } catch(Exception e) { System.out.println(e.getMessage()); } }
Me parecio muy util este ejemplo que encontré.
En el siguiente bloque de código se utiliza la clase Scanner para la lectura de un archivo .txt utilizando la sentencia try-catch-finally para el manejo de excepciones.
Scanner scanner = null; try { scanner = new Scanner(new File("test.txt")); while (scanner.hasNext()) { System.out.println(scanner.nextLine()); } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (scanner != null) { scanner.close(); } }
Enseguida el mismo ejemplo pero con try-with-resources.
try (Scanner scanner = new Scanner(new File("test.txt"))) { while (scanner.hasNext()) { System.out.println(scanner.nextLine()); } } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); }
Fuente:
y si se crean clases genéricas de manejo de errores es decir que en vez de ser manejado el error directamente en código envié el error a una clase superior ejemplo
public class FacturadorException extends Exception{ private int codigo; private String mensaje; private Object datos; public FacturadorException(EMensajes mensaje){ this.codigo = mensaje.getCodigo(); this.mensaje = mensaje.getDescripcion(); } public FacturadorException(EMensajes mensaje,Object datos){ this.codigo = mensaje.getCodigo(); this.mensaje = mensaje.getDescripcion(); this.datos = datos; } /** * @return the codigo */ public int getCodigo() { return codigo; } /** * @param codigo the codigo to set */ public void setCodigo(int codigo) { this.codigo = codigo; } /** * @return the mensaje */ public String getMensaje() { return mensaje; } /** * @param mensaje the mensaje to set */ public void setMensaje(String mensaje) { this.mensaje = mensaje; } /** * @return the datos */ public Object getDatos() { return datos; } /** * @param datos the datos to set */ public void setDatos(Object datos) { this.datos = datos; } }
y otra clases enum
public enum EMensajes { INSERTO(1, "Se insertó correctamente"), MODIFICO(1, "Se modificó correctamente"), ELIMINO(1, "Se eliminó correctamente"), CONSULTO(1, "Se ha consultado correctamente"), ERROR_INSERTO(-1, "Error al insertar el registro"), ERROR_MODIFICO(-1, "Error al modificar el registro"), ERROR_ELIMINO(-1, "Error al eliminar el registro"), ERROR_CONSULTO(-1, "Error al consultar el registro"), ERROR_REGISTRO_EXISTE(-1, "El registro ya existe"), ERROR_CONEXION_BD(-2, "No hay conexión con la base de datos"); private int codigo; private String descripcion; private EMensajes(int codigo, String descripcion) { this.codigo = codigo; this.descripcion = descripcion; } /** * @return the codigo */ public int getCodigo() { return codigo; } /** * @param codigo the codigo to set */ public void setCodigo(int codigo) { this.codigo = codigo; } /** * @return the descripcion */ public String getDescripcion() { return descripcion; } /** * @param descripcion the descripcion to set */ public void setDescripcion(String descripcion) { this.descripcion = descripcion; } }
clase que genera la excepción
public final class BdConexion { public static Connection conectar() throws FacturadorException { try { Class.forName("com.mysql.jdbc.Driver"); Connection cnn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/facturador_db", "root", "1234" ); cnn.setAutoCommit(false); return cnn; } catch (ClassNotFoundException | SQLException ex) { throw new FacturadorException(EMensajes.ERROR_CONEXION_BD); } ``` esto seria una buena practica para majar los errores ?
Acá les comparto un pequeño proyecto que busca un archivo (nombre completo con extensión) en una ruta dada del sistema operativo, y escribe las rutas donde lo encontró en un archivo de nombre paths.txt String fileSearch: nombre completo del archivo a buscar. String pathSearch: ruta absoluta en la que queremos buscar el archivo.
En este proyecto hice uso del bloque de control Try-Catch con parámetros:
package entryPoint; import java.io.IOException; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; public class Main { public static void main(String[] args) { String fileSearch = args[0]; String pathSearch = args[1]; String finalFile = "paths.txt"; try (PrintWriter writer = new PrintWriter(finalFile, StandardCharsets.UTF_8)) { Files.walkFileTree(Paths.get(pathSearch), new SimpleFileVisitor<>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { if (file.endsWith(fileSearch)) writer.println(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException e) { if (file.endsWith(fileSearch)) writer.println(file); return FileVisitResult.SKIP_SUBTREE; } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { if (dir.endsWith(fileSearch)) writer.println(dir); return FileVisitResult.CONTINUE; } }); } catch (IOException e) { e.printStackTrace(); } } }