Gestione delle eccezioni

Gestire le eccezioni

In VbLuaNet non è possibile utilizzare la gestione delle eccezioni del .NET. Le eccezioni vengono intercettata dal vbluanet e trasformate in errori standard lua. E' però possibile sfruttare la gestione dell'errore lua per ottenere un risultato simile. Si può chiamare la funzione call in "protected mode" ("x") per fare in modo che l'errore non venga propagato. In questa modalità la chiamata a call ritorna nil in caso di errore e i valori di ritorno di fooexc in caso tutto vada correttamente.

La funzione di gestione dell'errore fooerror è opzionale: se viene passato nil non verrà esposto nessun messaggio di errore.

VbLuaNet in caso di eccezione definisce una variabile globale "_LASTEXCEPTION" che può essere richiamata per ottenere informazioni relative all'eccezione. Questa variabile viene azzerata prima di ogni chiamata a un metodo .net e settata in caso di eccezione. La variabile globale contiene l'oggetto System.Exception.

Esempio gestione eccezioni [Lua]

foo = function()
   
    -- this function throws an exception (.NET)
    local fooexc = function()
      local person = PersonNew()      
      local res = person.testException(10, 0)      
    end  
    -- this function manage the exception
    local catch = function(msg)
      alert("I'm swallowing this message:\n", msg)
     
      -- get the latest exception object (.NET obj)
      local e = getglobal("_LASTEXCEPTION")
      alert("last exception:", e)    
    end
   
    -- try/catch surrogate
    if not call(fooexc, {}, "x", catch) then
      -- an error occurred
      alert(".NET exception swallowed!")
    end    
    alert("Test Completato")  
  end})

Generare un'eccezione

In determinate casistiche può essere, invece, utile generare un'eccezione. Per far ciò, il VbLuaNet mette a disposizione dell'utilizzatore il costrutto throw.

Di segeuito ne riportiamo un esempio.

Esempio generazione di una eccezione [Lua]

foo = function()
   
    local max = 100      
    local x = random(max)
    local y = random(max)
    if y == 0 then
      throw("Unable to divide a number by 0!")  
    end
   
    alert(x / y)
  end})