Gestione degli Errori negli Script

L'interfaccia di scripting di Photo>Graphics PRO gestisce le situazioni d'errore in modo differente dall'approccio tradizionale del REXX.

Nella massima parte dei sistemi di script basati su REXX, una notifica di errore viene ritornata tramite un codice d'errore.

Ogni funzione ritorna un codice per indicare il completamento o il fallimento delle operazioni richieste. Se avviene un errore specifico di Photo>Graphics (per esempio, non è stato possibile recuperare un file), viene generata una condizione di errore di sintassi, e il messaggio d'errore può essere recuperato chiamando la funzione CwGetErrorMsg. In questo modo, la tecnica normale per la gestione di un errore in Photo>Graphics PRO è arrestare lo script e mostrare un messaggio d'errore diagnostico.

Se si desidera che lo script reagisca all'errore senza fermarsi è necessario usare SIGNAL e quindi chiamare CwErrorMsg per recuperare il messaggio d'errore. (Se nessun errore si è verificato, CwErrorMsg ritornerà una stringa vuota. Ciò significa che è possibile separare gli errori specifici delle funzioni di Photo>Graphics PRO dai veri e propri errori di sintassi REXX.)

Vediamo il ragionamento dietro questa politica: gli script REXX solitamente sono usati per automatizzare compiti frequenti, che non richiedono grande raffinatezza. È però occasionalmente necessario fare qualcosa di più complesso in REXX. Questi compiti dovrebbero comunque essere possibili, mentre il materiale meno sofisticato dovrebbe comunque restare semplice da sviluppare. Questo inoltre assicura che uno script malfunzionante non continui accidentalmente, con il rischio (non trascurabile) di rovinare un lavoro magari particolarmente complesso.

Esempio:

call CwImportProject projectFile
è preferibile a
rc = CwImportProject(projectFile)
if rc = 0 then do
  Say "Error.  Unable to open file" projectFile
  exit
  end
Normalmente, producendo uno script particolarmente " terra-terra ", si potranno ignorare i valori di ritorno delle funzioni. Si consideri il seguente caso:
...
x=CwImportProject(pf)
oh=CwGetHandleFromObjectName('foo')
x=CwSetProperty(oh,"position:x", 5)
...

In questo caso, se la variabile pf contiene un nome di file non valido, lo script abortirà silenziosamente: sta all'utente aggiungere delle SAY per il debugging.
Questo può richiedere molto lavoro. Nel sistema di gestione di errori di Photo>Graphics PRO, un errore nella specifica del file causa allo script un'interruzione forzata, con l'apparizione di un messaggio d'errore chiaro in una message box assieme al numero di linea in cui l'errore è occorso. A questo punto è semplice tracciare l'errore.

Se si desidera scrivere uno script più complesso (e robusto), è possibile recuperare il controllo dopo un errore, anche se richiede un lavoro più complesso. Comunque uno script complesso abbastanza da richiedere un livello di tolleranza agli errori elevato è già da sé lungo (o anche parecchio lungo), per cui non c'è poi troppo da preoccuparsi.

L'intrappolamento di errori fatali è un compito molto semplice. Si eseguano le seguenti operazioni:

  1. Usare il comando SIGNAL per intercettare tutti gli errori.
  2. Invocare le funzioni pericolose.
  3. Se si ha successo, disabilitare l'intercettazione degli errori e continuare.
  4. Nella sezione di gestione degli errori:
    1. Disabilitare l'intercettamento (trapping).
    2. Usare CwGetErrorMsg e/o CwGetErrorFun per determinare l'occorrenza di un messaggio d'errore. In caso contrario, l'errore non è avvenuto a causa di Photo>Graphics PRO, ma è avvenuto un error edi sintassi vero e proprio, e il codice deve essere corretto. Si esca dal programma.
    3. Eliminare il messaggio d'errore usando CwClearError. (In caso contrario il messaggio resterà, causando a eventuali successivi errori di sintassi veri e propri un'identificazione come errori di Photo>Graphics PRO, con gli ovvi problemi risultanti.)
    4. Si effettuino le operazioni necessarie per correggere l'errore.

Segue un esempio. Questa è una funzione che tenta di caricare un progetto e ritorna 1 per indicare successo, 0 per indicare un fallimento.

loadFile:procedure
parse arg projectFile

signal on syntax name cantload  /* Trap syntax errors.*/
call CwImportProject projectFile

/* Success.  Switch trapping off and return. */
signal off syntax
return 1

/* Failure.*/
cantload:
signal off syntax

/* Check if the error isn't really something in the REXX end. */
msg = CwGetErrorMsg()
if msg = '' then do
  say "REXX syntax error."
  exit
  end
else do
  /* OK, it's ours.  Print an error message, clean up and return.*/
  say 'Error: ' msg 'in' CwGetErrorFun()
  call CwClearError
  end
return 0


Tipi di Dati

Indice

Lanciare uno Script