💻 Exemplos: Capítulo 11: Tratamento Robusto de Exceções, Hierarquia Throwable, Try-With-Resources e Exceções Customizadas
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:
- Try-with-resources com Recursos Múltiplos e AutoCloseable: garantia de liberação de handles de conexões financeiras.
- 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.
- 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
================================================================================