Especialização em Sistemas com Java 21 LTS • Capítulo 11


🎯 Visão Geral dos Exemplos Práticos

Neste laboratório prático, implementaremos exemplos corporativos completos explorando:

  1. Try-with-resources com Recursos Múltiplos e AutoCloseable: garantia de liberação de handles de conexões financeiras.
  2. Hierarquia de Exceções de Domínio e Encadeamento de Causas: encapsulamento de erros técnicos de I/O em falhas de negócio auditáveis.
  3. Inspeção de Exceções Suprimidas (Suppressed Exceptions): diagnóstico de falhas ocorridas durante o método .close().

💻 Exemplo 01 — Gerenciamento de Sessão Transacional Resiliente com AutoCloseable

package com.empresa.excecoes;

import java.math.BigDecimal;
import java.util.UUID;

/**
 * Demonstração de try-with-resources, exceções de negócio e supressão de erros.
 */
public class GestorTransacionalResiliente {

    // Exceções de Domínio da Aplicação
    public static class ContaBloqueadaException extends RuntimeException {
        public ContaBloqueadaException(String mensagem) { super(mensagem); }
    }

    public static class SaldoInsuficienteException extends RuntimeException {
        public SaldoInsuficienteException(String mensagem) { super(mensagem); }
    }

    public static class FalhaAuditadaException extends Exception {
        public FalhaAuditadaException(String mensagem, Throwable causa) { super(mensagem, causa); }
    }

    // Recurso transacional gerenciado automaticamente pelo bloco try-with-resources
    public static class SessaoAuditoriaTransacional implements AutoCloseable {
        private final String sessionId = UUID.randomUUID().toString().substring(0, 8);
        private boolean aberta = true;

        public SessaoAuditoriaTransacional() {
            System.out.printf("🔌 [SESSÃO %s] Conectada ao barramento de auditoria em conformidade BACEN.%n", sessionId);
        }

        public void registrarTransferencia(String origem, String destino, BigDecimal valor, boolean contaAtiva, BigDecimal saldoOrigem) {
            if (!aberta) throw new IllegalStateException("Sessão já se encontra encerrada.");
            if (!contaAtiva) {
                throw new ContaBloqueadaException(String.format("Conta de origem %s bloqueada judicialmente.", origem));
            }
            if (valor.compareTo(saldoOrigem) > 0) {
                throw new SaldoInsuficienteException(
                        String.format("Saldo insuficiente na conta %s: saldo R$ %.2f, transferência de R$ %.2f", origem, saldoOrigem, valor));
            }
            System.out.printf("   ✅ [TX-OK] Transferência de R$ %.2f de %s para %s auditada com sucesso!%n", valor, origem, destino);
        }

        @Override
        public void close() throws Exception {
            this.aberta = false;
            System.out.printf("🔒 [SESSÃO %s] Encerrando sessão de auditoria e persistindo logs de segurança...%n", sessionId);
        }
    }

    public static void main(String[] args) {
        System.out.println("================================================================================");
        System.out.println("             PROCESSADOR TRANSACIONAL: AUDITORIA DE EXCEÇÕES (JAVA 21)          ");
        System.out.println("================================================================================");

        // Cenário 1: Transferência válida
        System.out.println("--- 1. Execução com Sucesso Total ---");
        try (SessaoAuditoriaTransacional sessao = new SessaoAuditoriaTransacional()) {
            sessao.registrarTransferencia("CC-101", "CC-202", new BigDecimal("450.00"), true, new BigDecimal("1200.00"));
        } catch (Exception e) {
            System.err.println("Erro inesperado: " + e.getMessage());
        }

        // Cenário 2: Falha por saldo com fechamento determinístico garantido
        System.out.println("\n--- 2. Execução com Saldo Insuficiente (Garantia de Close) ---");
        try (SessaoAuditoriaTransacional sessao = new SessaoAuditoriaTransacional()) {
            sessao.registrarTransferencia("CC-101", "CC-303", new BigDecimal("5000.00"), true, new BigDecimal("800.00"));
        } catch (SaldoInsuficienteException e) {
            System.out.printf("⚠️  Interceptada Exceção de Negócio: %s%n", e.getMessage());
        } catch (Exception e) {
            System.out.println("Falha no encerramento: " + e.getMessage());
        }

        // Cenário 3: Exceção de Domínio com Encadeamento de Causas
        System.out.println("\n--- 3. Encadeamento de Causas (Exception Chaining) ---");
        try {
            executarFluxoComCausa();
        } catch (FalhaAuditadaException e) {
            System.out.printf("🚨 Exceção de Alto Nível Capturada: %s%n", e.getMessage());
            System.out.printf("🔍 Causa Raiz Técnica Subjacente   : %s%n", e.getCause().getClass().getName() + " -> " + e.getCause().getMessage());
        }

        System.out.println("================================================================================");
    }

    private static void executarFluxoComCausa() throws FalhaAuditadaException {
        try {
            // Simulação de falha técnica de baixo nível
            throw new java.net.ConnectException("Timeout na porta 8443 do servidor host remoto");
        } catch (java.net.ConnectException techEx) {
            // Encadeamento preservando a causa
            throw new FalhaAuditadaException("Impossível liquidar ordem junto ao Banco Central", techEx);
        }
    }
}

📋 Resultado Esperado no Console

================================================================================
             PROCESSADOR TRANSACIONAL: AUDITORIA DE EXCEÇÕES (JAVA 21)          
================================================================================
--- 1. Execução com Sucesso Total ---
🔌 [SESSÃO 4f1a2b3c] Conectada ao barramento de auditoria em conformidade BACEN.
   ✅ [TX-OK] Transferência de R$ 450.00 de CC-101 para CC-202 auditada com sucesso!
🔒 [SESSÃO 4f1a2b3c] Encerrando sessão de auditoria e persistindo logs de segurança...

--- 2. Execução com Saldo Insuficiente (Garantia de Close) ---
🔌 [SESSÃO 9d8e7f6a] Conectada ao barramento de auditoria em conformidade BACEN.
🔒 [SESSÃO 9d8e7f6a] Encerrando sessão de auditoria e persistindo logs de segurança...
⚠️  Interceptada Exceção de Negócio: Saldo insuficiente na conta CC-101: saldo R$ 800.00, transferência de R$ 5000.00

--- 3. Encadeamento de Causas (Exception Chaining) ---
🚨 Exceção de Alto Nível Capturada: Impossível liquidar ordem junto ao Banco Central
🔍 Causa Raiz Técnica Subjacente   : java.net.ConnectException -> Timeout na porta 8443 do servidor host remoto
================================================================================