Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Tratamento de exceção PL/SQL:não faça nada (ignore exceção)


Embora eu concorde que 99% das vezes é uma má prática ignorar silenciosamente as exceções sem pelo menos registrá-las em algum lugar, existem situações específicas em que isso é perfeitamente aceitável.

Nessas situações, NULL é seu amigo:
[...]
EXCEPTION

    WHEN OTHERS THEN
        NULL;
END;

Duas situações típicas em que ignorar exceções pode ser desejável são:

1) Seu código contém uma instrução que você sabe que falhará ocasionalmente e você não deseja que esse fato interrompa o fluxo do programa. Nesse caso, você deve colocar sua instrução em um bloco aninhado, como mostra o exemplo a seguir:
CREATE OR REPLACE PROCEDURE MY_PROCEDURE() 
IS
    l_empoyee_name  EMPLOYEES.EMPLOYEE_NAME%TYPE;
BEGIN
    -- Catch potential NO_DATA_FOUND exception and continue
    BEGIN 
        SELECT EMPLOYEE_NAME
        INTO l_empoyee_name
        FROM EMPLOYEES
        WHERE EMPLOYEE_ID = 12345;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            NULL;
        WHEN OTHERS THEN
            RAISE;
    END;

    do_stuff();

EXCEPTION

    WHEN OTHERS THEN
        -- Propagate exception
        RAISE;
END;

Observe que a PL/SQL geralmente não permite o tipo On Error Resume Next de tratamento de exceção conhecido do Visual Basic, onde todas as exceções são ignoradas e o programa continua a ser executado como se nada tivesse acontecido (consulte Em caso de erro, retome o próximo tipo de tratamento de erro em PL /oráculo SQL ). Você precisa incluir explicitamente instruções potencialmente com falha em um bloco aninhado.

2) Seu procedimento é tão sem importância que ignorar todas as exceções que ele lança não afetará a lógica do programa principal. (No entanto, isso raramente é o caso e muitas vezes pode resultar em um pesadelo de depuração a longo prazo)
BEGIN

    do_stuff();

EXCEPTION

    WHEN OTHERS THEN
        -- Ignore all exceptions and return control to calling block
        NULL;
END;