A propagação de exceções é um conceito importante no desenvolvimento de PL/SQL, especialmente quando lidamos com rotinas encadeadas. Em situações complexas, é essencial entender como as exceções são tratadas e propagadas através das diferentes camadas de procedimentos e funções. Vamos explorar duas abordagens principais para lidar com exceções: permitir a propagação de erros e interceptar erros para tratamento específico.
Criando um Exemplo Prático
Para ilustrar a propagação de exceções, vamos criar três procedimentos: PRC_NIVEL_01
, PRC_NIVEL_02
e PRC_NIVEL_03
. Cada um desses procedimentos irá chamar o próximo nível, simulando uma cadeia de chamadas.
Passo 1: Criar os Procedimentos
Primeiramente, vamos criar os três procedimentos. No PRC_NIVEL_03
, uma exceção será levantada intencionalmente.
CREATE OR REPLACE PROCEDURE PRC_NIVEL_03 IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Inicio PRC_NIVEL_03');
RAISE_APPLICATION_ERROR(-20001, 'Erro intencional no PRC_NIVEL_03');
DBMS_OUTPUT.PUT_LINE('Fim PRC_NIVEL_03');
END PRC_NIVEL_03;
/
-- Procedure created.
CREATE OR REPLACE PROCEDURE PRC_NIVEL_02 IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Inicio PRC_NIVEL_02');
PRC_NIVEL_03;
DBMS_OUTPUT.PUT_LINE('Fim PRC_NIVEL_02');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Erro capturado em PRC_NIVEL_02: ' || SQLERRM);
RAISE;
END PRC_NIVEL_02;
/
-- Procedure created.
CREATE OR REPLACE PROCEDURE PRC_NIVEL_01 IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Inicio PRC_NIVEL_01');
PRC_NIVEL_02;
DBMS_OUTPUT.PUT_LINE('Fim PRC_NIVEL_01');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Erro capturado em PRC_NIVEL_01: ' || SQLERRM);
END PRC_NIVEL_01;
/
-- Procedure created.
Passo 2: Executar o Procedimento Principal
Vamos executar o PRC_NIVEL_01
para observar o comportamento das exceções através da cadeia de chamadas.
BEGIN
PRC_NIVEL_01;
END;
/

Neste exemplo, o erro é propagado do PRC_NIVEL_03
para o PRC_NIVEL_02
e finalmente para o PRC_NIVEL_01
, onde é tratado.
Tratando o Erro Internamente
Agora, vamos modificar o PRC_NIVEL_02
para tratar o erro internamente e evitar que ele seja propagado para PRC_NIVEL_01
.
CREATE OR REPLACE PROCEDURE PRC_NIVEL_02 IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Inicio PRC_NIVEL_02');
PRC_NIVEL_03;
DBMS_OUTPUT.PUT_LINE('Fim PRC_NIVEL_02');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Erro tratado em PRC_NIVEL_02: ' || SQLERRM);
END PRC_NIVEL_02;
/
-- Procedure created.
Executando novamente o PRC_NIVEL_01
:
BEGIN
PRC_NIVEL_01;
END;
/

Com essa modificação, o PRC_NIVEL_02
trata o erro internamente, evitando que ele chegue ao PRC_NIVEL_01
.
Com base nos exemplos acima, podemos concluir que o comportamento das exceções em rotinas encadeadas depende de como elas são tratadas em cada nível. Se o erro for tratado internamente, ele não será propagado para o chamador. Caso contrário, ele continuará subindo pela cadeia de chamadas até encontrar um bloco de tratamento adequado. Essa abordagem permite um controle fino sobre o fluxo de exceções, permitindo ações específicas em diferentes níveis da aplicação.
🐓🫥 #20240709 #GuinaNãoTinhaDó #SeReagirBúmViraPó #GalgarPedra #AjudaODBA #DBAHerói #FitaLoka #MetaTomarSeuLugar #QueFita #VidaBandida #DinheiroNaMão #SeguroVaiCobrir #MundoMágicoOZ #GuinaNoPortão 🫥🐓