sexta-feira, 24 de maio de 2013

Comando Try / Catch


*  Nós, meros abap's, devemos trabalhar de uma forma que nunca cause
* problemas para o User, sempre informando, em formas de mensagens,
* caso alguma coisa saia fora do padrão. O problema é que as vezes acontece
* o famoso e temido 'DUMP' e isso é um pesadelo pra todo o ABAP porque
* significa que você não fez todas as tratativas possiveis, portanto o
* programa volta para a sua mão e você analisa o problema, analisando
* descobre que você não consegue tratar esse problema ( muito difícil
* isso acontecer ) mas mesmo assim, esse maldito 'DUMP' não pode ocorrer
* dinovo, pra garantir isso usamos o comando 'TRY / CATCH' que serve como
* uma forma de tratativa caso ocorra um 'DUMP' e assim você substitui
* aquela tela cheia de texto marcados em vermelho e que as vezes vem escrito
* tudo em alemão pro User e retorna uma mensagem toda feliz e tranquila.
*  Veja como abaixo. Esse comando é bem parecido com os de outras linguagens,
* use esse comando como ultima das suas ações, tente sempre tratar antes de
* processar qualquer coisa. Good Luck =)

REPORT try_catch.
*&---------------------------------------------------------------------*
DATA :
  vg_value  
TYPE i,
  vg_string 
TYPE string VALUE 'ABC',
  vg_cont   
TYPE i,
  it_mara   
TYPE TABLE OF mara,
  vg_where  
TYPE string VALUE 'VBELN = VG_STRING'.

*  Eu Criei um 'DO' pra vocês verem 'DUMP`s' diferentes acontecendo no mesmo
* programa e mesmo assim o processo não é abortado, e sim, é mostrado uma
* mensagem bem mais amigável.

DO 3 TIMES.
  BREAK-POINT.
  vg_cont = vg_cont + 
1.

*  Reparem no comando 'EXIT' abaixo de cada Instrução ABAP, esse comando
* finaliza o processo caso chegue nele, mas em nenhuns do caso vão chegar
* porque antes dele existe uma Instrução com 'DUMP'.
  
TRY.
      
CASE vg_cont.
* Divisão por 0.
        
WHEN 1.
          vg_value = 
1 / 0 .
          
EXIT.
* Calculos matemáticos com variáveis <> de numéricos.
        
WHEN 2.
          vg_value = 
1 * vg_string .
          
EXIT.
        
WHEN 3.
* Seleção de uma tabela aonde a condição é um campo inexistente na mesma
          
SELECT *
            
FROM mara
            
INTO TABLE it_mara
            
WHERE (vg_where) .
          
EXIT.
      
ENDCASE.

*  Aqui está o mais importante, essas abaixo são as classes de DUMP`s,
* que é informado em cada DUMP conforme Imagem abaixo.
    
CATCH cx_sy_zerodivide.
      
MESSAGE 'Divisão por zero huauhahua' TYPE 'I'.

    
CATCH cx_sy_conversion_no_number.
      
MESSAGE 'Calculando com algo diferente de Numero' TYPE 'I'.

    
CATCH cx_sy_dynamic_osql_semantics.
      
MESSAGE 'Esse campo não existe na tabela.' TYPE 'I'.

      BREAK-POINT.
  
ENDTRY.
ENDDO.

Um comentário:

  1. Só lembrando que alguns dumps são "non-catchable exceptions" , que não são pegos no TRY e sempre irão terminar em DUMP, como chamar via submit um programa que não é do tipo Report.

    ResponderExcluir