Vantagens, desvantagens e limitações da sua técnica:
-
Se o código de chamada for manipular a exceção verificada, você DEVE adicioná-lo à cláusula throws do método que contém o fluxo. O compilador não irá forçá-lo a adicioná-lo mais, então é mais fácil esquecê-lo. Por exemplo:
public void test(Object p) throws IllegalAccessException { Arrays.asList(p.getClass().getFields()).forEach(rethrow(f -> System.out.println(f.get(p)))); }
-
Se o código de chamada já tratar a exceção verificada, o compilador LHE lembrará de adicionar a cláusula throws à declaração do método. que contém o fluxo (se você não diria: A exceção nunca é lançada no corpo da instrução try correspondente).
-
Em qualquer caso, você não poderá cercar o próprio fluxo para capturar a exceção verificada dentro do método que contém o fluxo (se você tentar, o compilador dirá: A exceção nunca é lançada no corpo da instrução try correspondente).
-
Se você está chamando um método que literalmente nunca pode lançar a exceção declarada, então você não deve incluir a cláusula throws. Por exemplo: new String (byteArr, "UTF-8") lança UnsupportedEncodingException, mas UTF-8 é garantido pela especificação Java para sempre estar presente. Aqui, a declaração de lançamentos é um incômodo e qualquer solução para silenciá-lo com o mínimo de clichê é bem-vinda.
-
Se você odeia exceções verificadas e acha que elas nunca devem ser adicionadas à linguagem Java (um número crescente de pessoas pensa assim, e eu não sou um deles), então apenas não adicione a exceção verificada à cláusula throws do método que contém o fluxo. O verificado A exceção, então, se comportará como uma exceção não verificada.
-
Se você estiver implementando uma interface estrita na qual não tem a opção de adicionar uma declaração de lançamentos, e ainda lançar uma exceção, totalmente apropriado, em seguida, envolvendo uma exceção apenas para obter o privilégio de lançá-lo resulta em um stacktrace com exceções espúrias que não contribuem com nenhuma informação sobre o que realmente deu errado. Um bom exemplo é o Runnable.run (), que não lança nenhuma exceção verificada. Nesse caso, você pode decidir não adicionar a exceção verificada à cláusula throws do método que contém o fluxo.
-
Em qualquer caso, se você decidir NÃO adicionar (ou esquecer de adicionar) a exceção verificada à cláusula throws do método que contém o fluxo, esteja ciente dessas 2 conseqüências de lançar exceções CHECKED:
-
O código de chamada não será capaz de pegá-lo pelo nome (se você tentar, o compilador dirá: A exceção nunca é lançada no corpo da tentativa correspondente declaração). Ele irá borbulhar e provavelmente será capturado no loop principal do programa por alguma "captura Exception" ou "catch Throwable", que pode ser o que você quer de qualquer maneira.
-
Ele viola o princípio da menor surpresa: não será mais suficiente capturar o RuntimeException para garantir a captura de todos possíveis exceções. Por esse motivo, acredito que isso não deva ser feito no código da estrutura, mas apenas no código comercial que você controla completamente.
-
Referências:
- link
- link
- Anotação do projeto Lombok: @SneakyThrows
- Opinião de Brian Goetz (contra) aqui: link
- Solução alternativa para exceções verificadas no Java *
OBSERVAÇÃO: Se você decidir usar essa técnica, poderá copiar a classe LambdaExceptionUtil
do StackOverflow: link . Ele fornece a implementação completa (Função, Consumidor, Fornecedor ...), com exemplos.