Proč vavr zkusit kontejnerové úlovcích Throwable ale nikoliv výjimka?

hlasů
0

Nejsem odborník v systému typu java a zpracování výjimek. Ale našel jsem v tom, že bychom měli zachytit jen výjimky, ale ne Throwable to.

Zde je odkaz: rozdíl mezi použitím Throwable a výjimka v try catch

V knihovně Vavr to jsem našel tento zdrojový kód:

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);
    }
}

Bych mít nějaké problémy v budoucnu, pokud budu používat tento obal? Bude mi chybí některé zásadní výjimky, které mohou nastat v průběhu výkonu funkce ‚z‘?

Položena 02/12/2019 v 21:56
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
2

ThrowableJe supertřídou Exception, což znamená, catch (Throwable var)úlovky Výjimky stejně. Proto kód v vavr je správný - vždy, když je některý Throwablehozen bude zabalené v Try.Failure.

Odpovězeno 02/12/2019 v 22:00
zdroj uživatelem

hlasů
1

Všimněte si, co je odpověď říká v propojeném post:

Obecně byste měli to udělat, snad jen na nejvyšší „chytit všechny“ úroveň závitu, kde se chcete přihlásit, nebo jinak s nimi manipulovat naprosto vše, co se může pokazit .

Důraz důl.

Že je zde pravděpodobný záměr. To je tryobal určen pro manipulaci všechno a nechat uživatele rozhodnout, co chtějí řešit a jak na to. Zdá se, že jdou na konstruktu, jako je Scala je Try, aby vám zvládnout výjimky, aniž by ručně chytat. Za to pracovat a být konzistentní, vše by mělo být zacházeno stejným způsobem, nebo budeš mít nějaké výjimky, které potřebují být chycen, a další, které jsou zpracovány jako tato třída má v úmyslu.

pokud jde o

Bude mi chybí některé zásadní výjimky, které mohou nastat v průběhu výkonu funkce ‚z‘?

Nebude chybět. Oni se vrátí zabalený v Try.Failurea s nimi můžete manipulovat pak po obdržení chyby.

Odpovězeno 02/12/2019 v 22:01
zdroj uživatelem

hlasů
1

Důvod, že Throwablebyl použit místo Exception, je to, že chceme, aby naše Tryobjekty se také vydat Errors. To mu, jak model dědičnost Exceptionsa Errorsvypadá takto:

zadejte popis obrázku zde

Kdybychom jen chytit Exceptions, An IOErrorzřítí náš kód a nám brání používat sílu Tryřetězu:

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

Když lov Throwable, to IOErrorbude chycen, a budeme moci provést onFailuremetodu. Kdybychom jen chytit Exception, výkon by se zastavil na prvním řádku, a onFailurenikdy nebude vykonán.

Odpovězeno 16/01/2020 v 17:05
zdroj uživatelem

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