Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

A exceção OTHERS é executada na ordem que for colocada.

No bloco abaixo, todos os erros que não sejam de chave duplicada entrarão na exceção OTHERS pois ela está colocada antes das exceções de valores nulo e FK, como essas duas se encaixam dentro de uma exceção OTHERS, então elas serão apresentadas nesta que está colocada no bloco de exceções antes das próprias exceções que tratam o nulo e a FK. Então não é que a exceção OTHERS é executada sempre por último, como a resposta do exercício indica, é que quando ela é colocada antes de qualquer outra exceção, todas que vierem acabarão por entrar na OTHERS.

EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN
        RAISE_APPLICATION_ERROR(-20010, 'Cliente '||p_ID||' já cadastrado!!!');
    WHEN OTHERS THEN
        RAISE_APPLICATION_ERROR(-20025, 'Erro genérico : '|| SQLERRM);
    WHEN e_NULL THEN
        RAISE_APPLICATION_ERROR(-20015, 'A coluna ID não pode receber valores nulos ou vazios.');
    WHEN e_FK_SEGMENTO THEN
        RAISE_APPLICATION_ERROR(-20020, 'Segmento '||p_SEGMERCADO_ID||' precisa estar cadastrado na tela de segmentos.');
5 respostas
solução!

O entendimento de executada por último, nesta funcionalidade, é que ela sempre será a última alternativa a ser avaliada, isto é, ele sempre será condição verdade para execução e saída da estrutura de controle.

Olá Robson, tudo bem?

Sim Robson é verdade, todas que vierem após a exceção OTHERS não serão tratadas, pois entrará na exceção OTHERS e é ai onde entra a explicação do Erick, a exceção OTHERS é considera SEMPRE a última, pois mesmo que exista outras após, as mesmas não serão tratadas e por este motivo o indicado é sempre colocar a exceção OTHERS por último.

Explicação do exercício:

O OTHERS sempre será a última exceção a ser tratada, independente de sua posição no código, assim as exceções que vêm abaixo não serão tratadas.

Espero ter ajudado e bons estudos!

Acredito que seja apenas a questão de interpretação da questão. Assim como o Robson quando li a questão eu havia compreendido de uma forma diferente a resposta. Enquanto a resposta utiliza "ultima opção tratada" como uma forma de dizer que o que vem após ela sera ignorado (não será executado). Eu havia entendido "ultima opção tratada" no sentido de que a ordem como escrevemos as opções não importa (others será sempre o último caso a ser tratado, mesmo se na ordem escrita no código hajam outras exceções após ela).

Não sei se há uma forma que anular essa ambiguidade, aparentemente somos poucos os que tiveram essa interpretação diferente.

Olá Adriana, tudo bem?

Acho que agora compreende o X da questão, você e o Robson entenderam que se houver outras exceções após o OTHERS, primeiramente elas serão tratadas, deixando a exceção OTHERS por ultimo, seria isso?

Aguardo o seu retorno!

Olá Danielle, isso mesmo. Quando eu li a questão pela primeira vez essa tinha sido minha interpretação, por isso acretitava que essa era uma opção errada. Mas após ler a explicação da resposta entendi que eu havia compreendido errado a opção. Achei importante comentar para que vocês avaliem se vale a pena tentar fazer algum ajuste ou não.