* 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.
* 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.
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