programacion-avanzada / workspace

Workspace canónico de la materia Programación Avanzada, UNLaM
31 stars 30 forks source link

Sugerencia: agregar mas ejemplos de excepciones - HenryFor #73

Closed tomasserravento closed 3 years ago

tomasserravento commented 3 years ago

Agregar mas ejemplos sobre excepciones donde un try tenga distintos catch de distintas excepciones.

https://github.com/programacion-avanzada/workspace/tree/master/basicas-excepciones

Ejemplos: https://www.javatpoint.com/multiple-catch-block-in-java

delucas commented 3 years ago

El problema con eso, es que el ejemplo funcionará con una sola de las excepciones. ¿Se les ocurre un ejemplo puntual?

tomasserravento commented 3 years ago

Profe, como esta? Si tiene razon en que el ejemplo que dimos no es el mejor. Me parece importante agregar esto porque no mucha gente sabe que puede hacer varios catchs en un try y aunque no se use siempre a veces puede ser de mucha utilidad.

Aca le tengo une ejemplo copado que encontramos en GeeksForGeeks https://www.geeksforgeeks.org/multicatch-in-java/

Basicamente le pide al usuario que ingrese por teclado un numero. Y podes tener una excepcion si el numero es 0 (por el tema de la division) o si ingresa un string.

    public static void main(String args[])
    {
        Scanner scn = new Scanner(System.in);
        try
        {
            int n = Integer.parseInt(scn.nextLine());
            if (99%n == 0)
                System.out.println(n + " is a factor of 99");
        }
        catch (ArithmeticException ex)
        {
            System.out.println("Error: no se puede dividir por cero.");
        }
        catch (NumberFormatException ex)
        {
            System.out.println("Error: debe ingresar un numero entero.");
        }
    }

Si no tambien tengo un caso personal que uso yo en un programa para evitar que lo pirateen. Basicamente es un pequeño software de licencia donde si el numero de licencia aparece en una URL significa que el programa no debe funcionar. Basicamente es una blacklist.

Para que me sirve el multicatch? Principalmente por el IOException dado que a veces hay timeouts. Y tambien por NoClassDefFoundError debido a que algunas personas lograron evadir este sistema removiendole al jar acceso a clases de IO para que no pueda hacer la conexion a la URL.

        try {
            this.selfdefense = false;
            bool = true;
            URLConnection conn = new URL("https://miurl.com").openConnection();
            conn.setConnectTimeout(3500);
            conn.setReadTimeout(7000);
            conn.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0");

            // Codigo que se necesite en la conexion

        } catch (IOException ex) {
            if (ex.getMessage() != null && (ex.getMessage().contains("Server returned HTTP response code: 522 for URL:") || ex.getMessage().contains("connect timed out") || ex.getMessage().equals("Connection timed out: connect"))) {
                System.out.println("En este caso significa que no se pudo conectar a la URL porque esta caida o que hubo un timeout por una larga espera a la conexion.");
            } else
                System.out.println("Alguna otra excepcion de IO");
            // No bloqueo el uso del programa. Podria poner un codigo para probar mas tarde
        } catch (NoClassDefFoundError ex) {
            System.out.println("Este error se va a dar en este caso si alguien remueve alguna clase del jar para evitar acceso a la URL.");
            // Bloqueo el uso del programa
        } catch (Exception | Error ex) {
            System.out.println("Alguna otra excepcion o error.");
            ex.printStackTrace();
            // No bloqueo el uso del programa
        }
delucas commented 3 years ago

Referido en otro issue