Gestione delle eccezioni
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})