4.4. Gestione delle eccezioni nei controlli

4.4.1. Introduzione

La valutazione delle expr di datasource e condition puo’ terminare in modo anomalo in seguito ad errori di varia natura, come ad esempio:

  • Operazioni semanticamente non corrette (es. divizione per zero o operazioni matematiche tra stringhe di caratteri)
  • Timeout di rete
  • Errori di protocolli di rete (es. certificati invalidi in TLS/SSL)

Attraverso il costrutto try/catch e’ possibile intercettare queste eccezioni conoscendo il tipo di eccezione che si intende riconoscere e gestire*.

try ......... catch  <TIPO DI ECCEZIONE> ( .... )

4.4.2. Tipi di eccezioni e gerarchia delle eccezioni

L’eccezione generale che e’ possibile intercettare e’:

Exception

Questa e’ l’eccezione di default che viene intercettata quando non specificato altrimenti.

Questi due costrutti sono equivalenti:

try ... catch Exception (...)

try ... catch (...)

Danger

e’ fortemente sconsigliato utilizzare construtti try/catch intercettando sempre eccezioni generiche.

E’ sempre preferibile intercettare eccezioni specifiche:

try  1/0  catch Exception (-1)                                      NO

try  1/0  catch ZeroDivisionError (-1) catch Exception (-2)         SI

Tutti i tipi di eccezione esistenti (comprese le eccezioni dell’agente, vedi Eccezioni di Sanet) sono delle specializzazioni dell’eccezione base (derivano da Exception) e sono definite in base ad una gerarchia che permette di suddividere ed identificare meglio ogni tipo di eccezione.

Le eccezioni generate internamente da Sanet sono descritte in Eccezioni di Sanet.

4.4.3. Eccezioni di librerie esterne o di sistema

Non e’ possibile fornire un elenco puntuale completo di tutte le eccezioni che una expr puo’ generare.

Sanet si appoggia a diversi moduli esterni/librerie di sistema (python), ogniuno dei quali definisce nuovi tipi di eccezione specifiche.

L’unico modo per conoscere quali eccezioni possono essere intercettare e’ leggere la documentazione specifica dei moduli python/librerie che si stanno utilizzando.

Si veda anche Gerarchia generale delle eccezioni.

4.4.4. Eccezioni di Sanet

Quando Sanet valuta le expr puo’ sollevare un particolare tipo di eccezione chiamato:

PollException

Questa e’ l’eccezione base della maggior parte delle funzioni di Sanet.

Esempio:

try 1.3.6.1.2.1.1.1.0@ catch PollException ( "NO OID" ) != "NO OID"

Da PollException sono derivati altri sotto-tipi di eccezioni per identificare meglio casi di errore particolari.

Queste sono le sotto-eccezioni principali:

  • TimeoutException

    Viene sollevata quando viene riconosciuto, ma non gestito, un timeout di rete.

    Esempio:

    try ... catch TimeoutException (...)
    

    Warning

    alcune funzioni dell’agente gestiscono internamente molti tipi di errori (es: timeout), che non sono quindi intercettabili. Ad esempio, e’ inutile tentare di intercettare un timeout (e molte altre eccezioni di basso livello) della funzione urlContentMatches():

    try urlContentMatches("https://murolo/prova", "pippo") catch TimeoutException ()    INUTILE
    
  • UndefinedSnmpValueException

    Viene sollevata quando si tenta una GET SNMP senza successo.

    Esempio:

    try ... catch UndefinedSnmpValueException (...)
    
  • UndefinedValueException

    Viene sollevata quando si cerca di utilizzare un simbolo {<nome@} non definito.

    Esempio:

    try ... catch UndefinedValueException (...)
    

4.4.5. Gerarchia generale delle eccezioni

Questa e’ la gerarchia (non completa) delle eccezioni

Exception
|
+-- StandardError                          <- STANDARD EXCEPTIONS
|    |
|    +-- TypeError
|    |
|    +-- ValueError
|    |    +-- UnicodeError
|    |
|    +-- ArithmeticError
|    |
|    +-- RuntimeError
|    |    +-- NotImplementedError
|    |
|   ...
|
|
+-- <standard libraries>                   <- External libraries
|    |
|    |
|    + <urllib>
|    |  |
|    |  +-- URLErrror
|    |      |
|    |      +-- HTTPError
|    |
|   ...
|
+-- PollException                          <- SANET EXCEPTIONS
     |
    ...