SAP ABAP - Gestione delle eccezioni

Un exceptionè un problema che si pone durante l'esecuzione di un programma. Quando si verifica un'eccezione, il normale flusso del programma viene interrotto e l'applicazione del programma termina in modo anomalo, il che non è consigliato, pertanto è necessario gestire queste eccezioni.

Le eccezioni forniscono un modo per trasferire il controllo da una parte all'altra di un programma. La gestione delle eccezioni ABAP si basa su tre parole chiave: RAISE, TRY, CATCH e CLEANUP. Supponendo che un blocco solleverà un'eccezione, un metodo cattura un'eccezione utilizzando una combinazione delle parole chiave TRY e CATCH. Un blocco TRY - CATCH viene posizionato attorno al codice che potrebbe generare un'eccezione. Di seguito è riportata la sintassi per l'utilizzo di TRY - CATCH -

TRY.      
Try Block <Code that raises an exception> 
  
CATCH  
Catch Block <exception handler M>  
. . . 
. . . 
. . . 
CATCH  
Catch Block <exception handler R>
   
CLEANUP. 
   Cleanup block <to restore consistent state>
 
ENDTRY.

RAISE- Vengono sollevate eccezioni per indicare che si è verificata una situazione eccezionale. Di solito, un gestore di eccezioni tenta di riparare l'errore o di trovare una soluzione alternativa.

TRY- Il blocco TRY contiene la codifica dell'applicazione le cui eccezioni devono essere gestite. Questo blocco di istruzioni viene elaborato in sequenza. Può contenere ulteriori strutture di controllo e chiamate di procedure o altri programmi ABAP. È seguito da uno o più blocchi di cattura.

CATCH- Un programma cattura un'eccezione con un gestore di eccezioni nel punto in cui si desidera gestire il problema. La parola chiave CATCH indica la cattura di un'eccezione.

CLEANUP- Le istruzioni del blocco CLEANUP vengono eseguite ogni volta che si verifica un'eccezione in un blocco TRY che non viene catturata dal gestore dello stesso costrutto TRY - ENDTRY. All'interno della clausola CLEANUP, il sistema può ripristinare un oggetto a uno stato coerente o rilasciare risorse esterne. Cioè, il lavoro di pulizia può essere eseguito per il contesto del blocco TRY.

Sollevare eccezioni

Le eccezioni possono essere sollevate in qualsiasi momento in un metodo, un modulo funzione, una subroutine e così via. Esistono due modi per sollevare un'eccezione:

  • Eccezioni sollevate dal sistema runtime ABAP.

    Ad esempio Y = 1 / 0. Ciò risulterà in un errore di runtime di tipo CX_SY_ZERODIVIDE.

  • Eccezioni sollevate dal programmatore.

    Genera e crea simultaneamente un oggetto eccezione. Solleva un'eccezione con un oggetto eccezione già esistente nel primo scenario. La sintassi è: RAISE EXCEPTION exep.

Catturare le eccezioni

I gestori vengono utilizzati per catturare le eccezioni.

Diamo un'occhiata a uno snippet di codice:

DATA: result TYPE P LENGTH 8 DECIMALS 2, 
exref TYPE REF TO CX_ROOT, 
msgtxt TYPE STRING. 
PARAMETERS: Num1 TYPE I, Num2 TYPE I. 
TRY. 
result = Num1 / Num2. 
CATCH CX_SY_ZERODIVIDE INTO exref. 
msgtxt = exref→GET_TEXT( ). 

CATCH CX_SY_CONVERSION_NO_NUMBER INTO exref. 
msgtxt = exref→GET_TEXT( ).

Nello snippet di codice sopra, stiamo cercando di dividere Num1 per Num2 per ottenere il risultato in una variabile di tipo float.

Possono essere generati due tipi di eccezioni.

  • Errore di conversione del numero.

  • Dividi per zero eccezioni. I gestori rilevano l'eccezione CX_SY_CONVERSION_NO_NUMBER e anche l'eccezione CX_SY_ZERODIVIDE. Qui il metodo GET_TEXT () della classe di eccezione viene utilizzato per ottenere la descrizione dell'eccezione.

Attributi delle eccezioni

Ecco i cinque attributi e metodi di eccezioni:

S.No. Attributo e descrizione
1

Textid

Utilizzato per definire diversi testi per le eccezioni e influisce anche sul risultato del metodo get_text.

2

Previous

Questo attributo può memorizzare l'eccezione originale che consente di creare una catena di eccezioni.

3

get_text

Ciò restituisce la rappresentazione testuale come una stringa secondo la lingua di sistema dell'eccezione.

4

get_longtext

Ciò restituisce la variante lunga della rappresentazione testuale dell'eccezione come stringa.

5

get_source_position

Fornisce il nome del programma e il numero di riga raggiunto nel punto in cui è stata sollevata l'eccezione.

Esempio

REPORT ZExceptionsDemo. 
PARAMETERS Num_1 TYPE I. 

DATA res_1 TYPE P DECIMALS 2. 
DATA orf_1 TYPE REF TO CX_ROOT. 
DATA txt_1 TYPE STRING. 

start-of-selection. 
Write: / 'Square Root and Division with:', Num_1. 
write: /. 

TRY. 
IF ABS( Num_1 ) > 150. 
RAISE EXCEPTION TYPE CX_DEMO_ABS_TOO_LARGE. 
ENDIF.
  
TRY. 
res_1 = SQRT( Num_1 ). 
Write: / 'Result of square root:', res_1. 
res_1 = 1 / Num_1. 

Write: / 'Result of division:', res_1. 
CATCH CX_SY_ZERODIVIDE INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ). 
CLEANUP. 
CLEAR res_1. 
ENDTRY. 

CATCH CX_SY_ARITHMETIC_ERROR INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ).

CATCH CX_ROOT INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ). 
ENDTRY. 
IF NOT txt_1 IS INITIAL. 
Write / txt_1. 
ENDIF. 
Write: / 'Final Result is:', res_1.

In questo esempio, se il numero è maggiore di 150, viene sollevata l'eccezione CX_DEMO_ABS_TOO_LARGE. Il codice precedente produce il seguente output per il numero 160.

Square Root and Division with: 160 
The absolute value of number is too high 
Final Result is:  0.00