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 ao Either a b do 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> e Stream<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] e Either[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.