Repensando as checked exceptions do Java: um recurso subestimado de segurança de tipos
(hackers.pub)Resumo dos principais pontos
- As checked exceptions do Java, embora sejam amplamente criticadas pela comunidade, têm vantagens notáveis do ponto de vista da segurança de tipos.
- Fornecem um mecanismo de segurança de tipos conceitualmente semelhante ao
Result<T, E>do Rust ou aoEither a bdo Haskell. - As checked exceptions expressam explicitamente no método a possibilidade de falha, forçando o tratamento de erros por meio do sistema de tipos.
Vantagens das checked exceptions
- Oferecem segurança de tipos ao verificar em tempo de compilação se a exceção foi tratada.
- Tornam a possibilidade de exceção parte do contrato da API ao explicitá-la na assinatura do método com a cláusula
throws. - Fornecem um mecanismo conveniente em que, apenas com a declaração, a exceção é propagada automaticamente.
- Ao contrário do Rust, não exigem sintaxe adicional como o operador
?a cada chamada.
Problemas das checked exceptions
- Geram código boilerplate excessivo na cadeia de chamadas.
- Têm baixa compatibilidade com programação funcional, como lambdas e a Stream API introduzidas após o Java 8.
- Dificultam a evolução da API por causa de quebras de compatibilidade ao adicionar novas exceções a interfaces.
- Podem incentivar antipadrões de ignorar exceções.
Propostas de melhoria
- Melhorar as interfaces funcionais para que lambdas possam declarar checked exceptions.
- Adicionar suporte a tipos genéricos de exceção na cláusula
throws. - Expandir APIs para lidar melhor com checked exceptions em contextos funcionais.
- Melhor integração com as APIs
Optional<T>eStream<T>.
Comparação com outras linguagens
- Rust: oferece um mecanismo explícito de tratamento de erros com
Result<T, E>e o operador?. - Kotlin: tornou todas as exceções unchecked, mas oferece estruturas funcionais como
runCatching. - Scala: oferece tratamento funcional de erros com tipos monádicos como
Try[T]eEither[A, B].
Conclusão
- As checked exceptions precisam ser reavaliadas como um recurso inovador e mal compreendido do Java.
- Em vez de abandoná-las completamente, o ideal é aprimorá-las para que se integrem bem aos recursos modernos do Java.
- Há potencial para evoluí-las na direção de resolver problemas práticos sem abandonar o paradigma existente.
- É importante encontrar um ponto de equilíbrio entre segurança de tipos, concisão de código e flexibilidade.
1 comentários
Pareceu que eu estava repetindo uma discussão que já vinha sendo feita há mais de uma década. Soa como a defesa de que exceptions têm tanto valor quanto tipos, e eu gostaria de responder que os tipos já são suficientes.