¿Por qué las capturas de contenedores Trate de vavr Throwable pero no Excepción?

votos
0

No soy un experto en sistema de tipos de Java y el manejo de excepciones. Pero me encontré en la que sólo debemos capturar las excepciones, pero no de lanzables.

Aquí está el enlace: Diferencia entre el uso de Throwable y Excepción en un intento de captura

En la biblioteca de Vavr me encontré con este código fuente:

public interface Try<T> extends Value<T>, Serializable {
long serialVersionUID = 1L;

static <T> Try<T> of(CheckedFunction0<? extends T> supplier) {
    Objects.requireNonNull(supplier, supplier is null);

    try {
        return new Try.Success(supplier.apply());
    } catch (Throwable var2) {
        return new Try.Failure(var2);
    }
}

¿Me habría ningún problema en el futuro si voy a utilizar este contenedor? ¿Voy a perder algunas excepciones importantes que pueden ocurrir durante la ejecución de la función 'de'?

Publicado el 02/12/2019 a las 23:56
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
2

Throwablees una superclase de Exception, es decir, catch (Throwable var)las capturas excepciones también. Por lo tanto el código en vavr es correcto - cuando se produzca algún Throwabletirado será envuelto en una Try.Failure.

Respondida el 03/12/2019 a las 00:00
fuente por usuario

votos
1

Tenga en cuenta lo que la respuesta en el post relacionado dice:

En general, usted no debe hacer eso, excepto quizás en el más alto "todo" ni nivel de un hilo en el que desea registrar o manejar de otra manera absolutamente todo lo que puede ir mal .

El énfasis es mío.

Esto es probable que la intención aquí. Se trata de una tryenvoltura hecha para manejar todo y dejar que el usuario decida lo que quiere tratar y cómo. Parece que van de una construcción como la Scala de Tryque le permite controlar las excepciones sin coger manualmente. Para que trabajar y ser consistente, todo debe ser manejado de la misma manera, o que tendría algunas excepciones que necesitan ser atrapado, y otros que se manejan como esta clase tiene la intención.

Como para

¿Voy a perder algunas excepciones importantes que pueden ocurrir durante la ejecución de la función 'de'?

Que no se pierda ellos. Están ser devueltos envuelto en una Try.Failure, y usted puede manejarlos a continuación, después de recibir el error.

Respondida el 03/12/2019 a las 00:01
fuente por usuario

votos
1

La razón por la que Throwablese utilizó en lugar de Exception, es porque queremos que nuestros Tryobjetos también a atrapar Errors. Esto a su forma en que el modelo de herencia de Exceptionsy Errorsse ve así:

introducir descripción de la imagen aquí

Si tan sólo nos ponemos al día Exceptions, una IOErrorse estrellaría nuestro código y nos impiden el uso de la fuerza de una Trycadena:

Try.of(() -> throw new IOError(null))
  .onFailure(() -> /* Do something to fix the IOError */);

Cuando la captura Throwable, este IOErrorserá capturado, y que será capaz de ejecutar el onFailuremétodo. Si tan sólo nos ponemos al día Exception, la ejecución se habría detenido en la línea uno, y el onFailurenunca sería ejecutado.

Respondida el 16/01/2020 a las 19:05
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more