Exception Stack Functions

O que será que acontece se dentro de um bloco anônimo, invocarmos uma procedure que irá gerar um erro? Bem, é verdade que o erro será lançado, na verdade esse erro poderá ser lançado inúmeras vezes, dependendo da profundidade das chamadas que foram feitas. Mas, quais erros serão mostrados? Imagine uma profundida ainda maior, de uma procedure que invoca outra procedure e aí por diante. Como iremos tratar esse erro? E como iremos descobrir aonde e qual é o erro?

Bem, antes de tudo, vejamos o que acontece ao invocarmos algumas procedures dentro de um bloco PL/SQL em que a última chamada irá lançar um erro, empilhando assim o erro(stack), vejamos a mensagem que podemos obter disto, para isto vamos criar duas procedures, uma invoca a outra, e utilizar em um bloco anônimo.

Ao ficar relançando os erros, foi criado um error stack, e para saber a causa raiz do erro devemos analisar esse stack, que geralmente é sempre o primeiro erro lançado, que no caso foi o erro -06502.

No Oracle 12c, temos um novo package, o UTL_CALL_STACK provê uma interface para os desenvolvedores obterem informações sobre o programa corrente, muito útil ao criar logs por exemplo e se trabalhar com stacks de erros. Esse package contem algumas funções muito úteis. Vejamos algumas:

  • BACKTRACE_DEPTH – Retorna um número inteiro positivo mostrando a quantidade de itens no backtrace. Retorna zero se não existir nenhuma exeption.
  • BACKTRACE_LINE – Retorna a linha em que ocorreu o erro em uma determinada profundidade(depth).
  • BACKTRACE_UNIT – Retorna o nome do módulo, que pode ser o nome de uma função, em que ocorreu o erro em determinada profundidade. Ou então NULL caso na profundidade especificada pelo argumento seja um bloco anônimo.
  • ERROR_DEPTH – Retorna o número de erros do stack.
  • ERROR_MSG – Retorna a mensagem de erro em uma determinada profundidade.
  • ERROR_NUMBER – Retorna o número do erro em uma determinada profundidade.
  • Backtrace nada mais é que o traço de onde a exceção foi lançado para onde ela é examinada. No exemplo anterior, a profundidade(depth) do backtrace foi 3, já que o bloco anônimo invocou a procedure segunda que invoca a procedure primeira que é onde o erro acontece. Talvez ao ler o conceito das funções acima, seja um pouco difícil visualizar o que cada uma faz. Vejamos com exemplo agora, o que podemos fazer com cada uma das funções citadas.

    Na imagem acima, fizemos a mesma chamada a procedure segunda, que lança o erro, mas dessa vez vamos tratar corretamente no bloco Exception. Foi feito um FOR nas linhas 6 à 15 para isto. Esse for tem o índice começando de 1 até a profundidade do stack, que é 3 no caso, conforme podemos ver na linha 5. Na linha 7 foi feito um IF para ver se o backtrace_unit é null, indicando se o erro nessa profundidade é em um bloco anônimo ou não. Então nas linhas 8 ou 10, dependendo do resultado do IF, é retornado o nome do bloco, e a linha em que ocorreu o erro. Mas até agora não conseguimos ver a causa raiz do erro que foi na procedure primeira. Isso é feito no IF nas linhas 12 e 13. Em que comparamos a profundidade, que é o índice do nosso FOR, com o error_depth. Caso sejam iguais iremos então imprimir o número do erro junto com a sua mensagem de erro, conforme a linha 13. Foi feito um LPAD no error_number, pois essa função retorna um número inteiro. Então, o resultado, na sequencia de cima pra baixo, podemos ver quem lançou pra quem o erro e por último que erro foi esse.

    Anúncios

    Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert e OCP PL/SQL, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

    Marcado com: , , , , , , , ,
    Publicado em Exceptions

    Deixe um comentário

    Preencha os seus dados abaixo ou clique em um ícone para log in:

    Logotipo do WordPress.com

    Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

    Foto do Google

    Você está comentando utilizando sua conta Google. Sair /  Alterar )

    Imagem do Twitter

    Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

    Foto do Facebook

    Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

    Conectando a %s

    Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.

    Esse Blog é reconhecido pela
    Sou um
    Certificações
    Sou articulista

    Clique para seguir este blog e receber notificações via email de novos posts.

    Tércio Costa

    Tércio Costa

    Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert e OCP PL/SQL, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

    Links Pessoais

    Serviços verificados

    Visualizar Perfil Completo →

    Total de Visualizações da Página
    • 142.605 Visualizações
    %d blogueiros gostam disto: