Exceptions

Aula
Estado
💡
São um evento inesperado que interrompem o fluxo normal do programa
  • Todas estendem a classe Throwable
  • Existem dois tipos Checked e Unchecked
    • Checked Exceptions precisam ser capturadas ou explicitamente propagadas pelos métodos através da clausula throws. Normalmente representam problemas normais no fluxo do programa (e.g. um id de cliente não existir na base de dados)
    • Unchecked Exceptions: podem ser capturadas e não precisam ser explicitamente propagadas. Geralmente representam bugs que devem ser corrigidos (e.g. um NullPointer)
  • Suas próprias exceções devem estender a classe Exception ou um descendente mais específico de Throwable
  • É possível lançar uma exceção com o operador throw (e.g. throw new ProductNotFoundException())
    • notion image
  • Quando uma exceção é lançada o controle do programa passa para o Exception Handler mais próximo; se um Exception Handler não existe para o método, exceções unchecked são propagadas para o invocador do método

Capturando Exceções

💡
Quanto mais específica a exceção capturada for, mais fácil identificar a causa dela
  • O trecho de código que pode produzir erro deve estar no bloco de try
  • Para capturar um tipo de exceção deve-se utilizar catch (e.g. catch (Exception e))
    • as exceções são capturadas por ordem de especificidade, a exceção menos específica deve ficar por último na sequencia de catch's (o compilador irá avisar caso isso seja violado)
    • um bloco de captura pode capturar múltiplos tipos de exceção NullPointerException | ArithmeticException
    • quanto mais específica a exceção capturada for, mais fácil identificar a causa do erro
notion image
  • É possível definir um bloco de código que executa ao final do fluxo do bloco try, mesmo que uma exceção seja lançada e o bloco não seja completamente percorrido, com o bloco finally
    • normalmente utilizado para liberar recursos ou encerrar algo iniciado no bloco de try
  • Ao capturar uma exceção você pode: escrever logs, lançar outra exceção, interromper a execução do restante do método ou tomar quaisquer outras medidas corretivas
  • É possível aninhar blocos de try ... catch nos blocos de catch, finally ou try
notion image

Auto-Closure

  • Utilizando a sintaxe de try-with-parameters e passando classes que implementem a interface AutoCloseable
    • A interface AutoCloseable possuí apenas o método close()
    • essa sintaxe é identificada pelo compilador que, implicitamente, cria um bloco finally e executa as ações necessárias para cada parâmetros passado ao try
  • É possível inicializar múltiplos recursos nos parâmetros do try-with-parameters
notion image
  • Pode ocorrer de exceções serem escondidas devido a sintaxe de auto-closure. Se uma exceção for lançada no bloco implícito finally, não é possível capturar essa exceção. É possível, porém, em um bloco catch de outra exceção, ler as mensagens que foram escondidas com o método getSuppressed()
Â