Analyzing Runtime Errors

Objective

After completing this lesson, you will be able to analisar erros em tempo de execução

Dump breve ABAP

A necessidade de depuração

Não há como evitar o fato de que erros ocorrem em programas. No entanto, eles se manifestam de diferentes maneiras. Quando um usuário inicia um aplicativo com erro, ele pode falhar, algo inesperado pode ocorrer ou absolutamente nada pode ocorrer. Do ponto de vista do usuário, no nível da interface do usuário, é impossível afirmar exatamente como e por que esse erro ocorreu.

Como desenvolvedor, agora você precisa examinar o programa mais de perto, linha por linha, de fato, para estabelecer exatamente quais instruções e combinações de valores nas diferentes variáveis do programa causaram o erro. É aqui que o depurador entra.

Erros em tempo de execução

Código ABAP que contém uma instrução que irá dividir por zero

É importante executar uma verificação de sintaxe regularmente ao escrever o código ABAP. No entanto, a sintaxe correta nem sempre significa que seu programa será executado com êxito no momento da execução.

Por exemplo, os cálculos em seu programa podem causar um problema dependendo dos valores utilizados. A figura, Um programa sintaticamente correto pode ter problemas, demonstra um programa que, embora sintaticamente correto, causará um erro em tempo de execução.

Dump breve ABAP

Captura de tela de um dump breve com informações sobre o erro

Se o ambiente de tempo de execução encontrar uma instrução que não pode ser executada, ele cancela o programa e aciona um erro em tempo de execução. Cada erro em tempo de execução é identificado por um nome e atribuído a uma situação de erro específica. O ambiente de tempo de execução cancela o programa se um erro em tempo de execução não for interceptado. O erro em tempo de execução ABAP pode ser exibido no ABAP Runtime Error Viewer a partir do ABAP 7.53.

O ABAP Runtime Error Viewer pode ser aberto utilizando diferentes pontos de acesso:

  • Se o erro ocorrer durante a execução da aplicação ABAP, é exibido um diálogo no canto inferior direito. Selecione Exibir para exibir o erro.
  • Na visão Leitor de feed, clique duas vezes na entrada de erro em tempo de execução.

A partir da barra de ferramentas, você pode navegar para a posição do texto fonte onde o dump ocorreu e compartilhar o link para o dump.

Captura de tela dos botões “Navegar para código-fonte” e “Compartilhar link para despejo”
Captura de tela do menu de contexto após clicar com o botão direito do mouse no código-fonte no dump breve

Existem três guias na parte inferior do editor:

  1. O primeiro fornece as seguintes informações:

    • Informações de cabeçalho
    • Análise de erros
    • Informações sobre onde o programa foi cancelado
    • Extrato de texto fonte
    • A linha na qual o erro ocorreu é destacada; selecione a linha para navegar para o erro no texto fonte
    • Chamadas/eventos ativos
  2. A guia Texto descritivo fornece as informações completas do dump. Ele suporta os recursos, Esboço e Estrutura rápida (Ctrl+ O no teclado).

  3. A ficha de registro Exibição não formatada fornece as informações de dump em um formato técnico que só é necessário para situações de análise especiais.

Um dump breve também permite que você navegue diretamente para o ABAP Debugger para ver os valores de variáveis imediatamente antes de o erro em tempo de execução ter ocorrido.

Os erros em tempo de execução são normais. Você provavelmente irá encontrá-los com frequência durante o desenvolvimento de seus programas. No entanto, é importante que você tente preveni-los. Um usuário em seu sistema produtivo pode estar confuso se vir um erro em tempo de execução, como o erro na figura. O usuário pode não compreender uma referência à aplicação ABAP e às informações técnicas apresentadas.

Evitar erros em tempo de execução

Diagrama mostrando o fluxo lógico de um método com ramificação condicional para evitar um dump breve
Exemplo de implementação de um método com ramificação condicional para evitar um dump breve

No exemplo acima, a lógica foi adicionada para evitar a divisão por zero de erro em tempo de execução.

Utilizar lógica condicional para evitar um erro em tempo de execução

Exemplo de negócio

Um de seus colegas criou um programa que calcula o número médio de dias de férias restantes para cada mês restante no ano. Outro colega mencionou que o programa se apresenta estranhamente quando não restam meses no ano. Teste o programa e efetue as modificações necessárias para garantir que ele funciona em todas as circunstâncias.

Nota

Neste exercício XX se refere ao seu número.

Etapas

  1. No seu pacote, crie uma nova classe ABAP com o nome ZCL_XX_DUMP. Certifique-se de que utiliza a interface IF_OO_ADT_CLASSRUN. Quando você for solicitado a atribuir a classe a uma ordem de transporte, utilize a ordem de transporte que você criou na tarefa anterior.

    1. Selecione ArquivoNovaClasse ABAP.

    2. Insira seu pacote ZS4D100_XX

    3. Insira o nome ZCL_XX_DUMP e uma descrição para sua classe.

    4. Selecionar Adicionar... (ao lado do quadro de grupo Interfaces).

    5. Insira o texto de filtro IF_OO_ADT_CLASSRUN. Clique duas vezes na entrada correspondente na lista de ocorrências.

    6. Selecione Avançar.

    7. Selecione entre as ordens nas quais estou envolvido e sua própria ordem de transporte.

    8. Selecione Concluir.

  2. No if_oo_adt_classrun~main( ), adicione o seguinte código:

    1. No editor, insira a seguinte codificação entre METHOD if_oo_adt_classrun~main e ENDMETHOD.

      Code Snippet
      123456
      DATA: lv_mths TYPE i VALUE 10, "No. of months remaining in year lv_hols TYPE i VALUE 20, "No. of days untaken vacation lv_avg_hols TYPE i. lv_avg_hols = lv_hols / lv_mths. out->write( |Average vacation days per month { lv_avg_hols }| ).
  3. Ative e teste sua classe.

    1. Ative a classe com o atalho do teclado Ctrl + F3.

    2. Execute a classe com a chave F9.

    Resultado

    O programa emite a média dos dias de férias restantes por mês.
  4. Modifique o programa de teste, verifique o resultado se faltam 0 meses no ano e o empregado tem 20 dias de férias não utilizados.

    1. Defina o valor de lv_mths como 0.

    2. Selecione Ativar (Ctrl+F3).

    3. Execute o programa selecionando F9.

    Resultado

    O programa é cancelado e exibe os detalhes de um erro em tempo de execução.
  5. Analise o erro em tempo de execução para identificar o problema. Por que o erro ocorreu?

    1. Execute o programa selecionando F9.

    2. O Eclipse exibirá uma janela pop-up na parte inferior direita com o título Erro em tempo de execução ABAP.

    3. Clique no link Mostrar para analisar o erro.

    4. Página abaixo para ver o que aconteceu e qual linha causou o erro.

    O erro ocorreu porque é matematicamente impossível dividir por zero.

  6. Mude para o editor ABAP.

    1. Selecione a guia ZCL_S4D100_XX_DUMP.

  7. Para evitar que o erro em tempo de execução ocorra, implemente uma condição para que o programa edite o seguinte texto se não restarem meses: Pergunte se você pode prorrogar suas férias restantes. Caso contrário, execute o cálculo e emita o resultado como antes.

    1. Adicione o seguinte código em torno do cálculo existente:

      Code Snippet
      123456
      IF lv_mths NE 0. lv_avg_hols = lv_hols / lv_mths. out->write( |Average vacation days per month { lv_avg_hols }| ). ELSE. out->write( |Please ask to roll over remaining vacation| ). ENDIF.
    2. Agora, ative e teste o programa.

      Code Snippet
      1234567891011121314151617181920212223242526
      * Full Solution Code CLASS zcl_s4d100_dump DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES if_oo_adt_classrun . PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS zcl_s4d100_dump IMPLEMENTATION. METHOD if_oo_adt_classrun~main. DATA: lv_mths TYPE i VALUE 0, "No. of months remaining in year lv_hols TYPE i VALUE 10, "No. of days untaken vacation lv_avg_hols TYPE i. IF lv_mths <> 0. lv_avg_hols = lv_hols / lv_mths. out->write( |Average vacation days per month { lv_avg_hols }| ). ELSE. out->write( |Please ask to roll over remaining vacation!| ). ENDIF. ENDMETHOD. ENDCLASS.

      Praticar