Latest web development tutorials

Lua Gestione degli errori

Programma gestione degli errori è necessario eseguire, nel nostro operazioni sui file, il trasferimento di dati e servizi web invocazione apparirà errori imprevisti. Se non si presta attenzione a che fare con i messaggi di errore, in base alle informazioni perderà, non può essere eseguito, e così via.

Ogni linguaggio di programmazione, è necessaria la gestione degli errori. Tipi di errore sono:

  • Errore di sintassi
  • Errore di runtime

Errore di sintassi

Gli errori di sintassi sono solito a causa di componenti del programma (ad esempio, gli operatori, espressioni) causati da un uso improprio. Un semplice esempio è il seguente:

-- test.lua 文件
a == 2

Il codice precedente viene eseguito come risultato di:

lua: test.lua:2: syntax error near '=='

Come si può vedere, ci sono stati più di un errore di sintassi, un segno "=" seguito da due "=" segno è diverso. A "=" è l'espressione di assegnamento due "=" è l'operazione di confronto.

Un altro esempio:

for a= 1,10
   print(a)
end

Il programma di cui sopra verrà visualizzato i seguenti errori:

lua: test2.lua:2: 'do' expected near 'print'

Gli errori di sintassi è più facile che l'esecuzione di un errore di programma, errore di run in grado di individuare gli errori specifici, errori grammaticali che siamo in grado di risolvere in modo rapido, come gli esempi sopra riportati, purché facciamo in per dichiarazione possono essere aggiunti:

for a= 1,10
do
   print(a)
end

Errore di runtime

Eseguire il programma in grado di eseguire l'errore è normale, ma il risultato sarà un messaggio di errore. Gli esempi che seguono, perché i parametri di input errori, errore di esecuzione del programma:

function add(a,b)
   return a+b
end

add(10)

Quando abbiamo compilare ed eseguire il codice riportato di seguito, il compilatore può avere successo, ma in fase di esecuzione produrrà il seguente errore:

lua: test2.lua:2: attempt to perform arithmetic on local 'b' (a nil value)
stack traceback:
	test2.lua:2: in function 'add'
	test2.lua:5: in main chunk
	[C]: ?

Il seguente messaggio di errore è causato perché il programma manca il parametro b.


Gestione degli errori

Possiamo usare due funzioni: assert ed errori per gestire gli errori. Esempi sono i seguenti:

local function add(a,b)
   assert(type(a) == "number", "a 不是一个数字")
   assert(type(b) == "number", "b 不是一个数字")
   return a+b
end
add(10)

Il programma di cui sopra verrà visualizzato i seguenti errori:

lua: test.lua:3: b 不是一个数字
stack traceback:
	[C]: in function 'assert'
	test.lua:3: in local 'add'
	test.lua:6: in main chunk
	[C]: in ?

Esempio affermare prima controlla il primo argomento, se non è un problema, affermare non fa nulla, in caso contrario, il secondo argomento ad affermare messaggio di errore generato.

funzione di errore

sintassi:

error (message [, level])

: Termina la funzione in corso di esecuzione, e restituisce il contenuto del messaggio come il messaggio di errore (funzione di errore non tornerà mai più)

In genere, l'errore sarà alcune informazioni aggiuntive sul messaggio di errore nella posizione di testa.

parametro del livello indica la posizione da sbagliare:

  • Livello = 1 [default]: Per chiamare l'errore (file + numero di riga)
  • Livello = 2: funzione che chiama la funzione di errore indicato
  • Livello = 0: non aggiungere posizione dell'errore

PCALL e xpcall, eseguire il debug

la gestione degli errori Lua, è possibile utilizzare la funzione PCALL (chiamata protetta) per avvolgere il codice da eseguire.

PCALL ricevere una funzione e si vuole passare un parametro di quest'ultimo, ed eseguito, il risultato: c'è un errore, nessun errore, o il valore di ritorno di vero o falso, ErrorInfo.

La sintassi è la seguente

if pcall(function_name, ….) then
-- 没有错误
else
-- 一些错误
end

Semplice esempio:

> =pcall(function(i) print(i) end, 33)
33
true
   
> =pcall(function(i) print(i) error('error..') end, 33)
33
false        stdin:1: error..
> function f() return false,2 end
> if f() then print '1' else print '0' end
0

PCALL in una "modalità protetta" per chiamare il primo argomento, quindi PCALL funzione di acquisizione in grado di eseguire eventuali errori.

In genere quando si verifica un errore, si spera di finire con più informazioni di debug, non solo dove si è verificato l'errore. Ma ritorna PCALL, ha distrutto parte del contenuto della chiamata Zhan.

Lua offre xpcall funzione, xpcall ricevere un secondo parametro - un gestore di errori quando si verifica un errore, gestore degli errori Lua sarà chiamato prima di chiamare spettacolo Zhan vedere (rilassarsi), quindi è possibile utilizzare questa funzione in libreria di debug per ottenere ulteriori informazioni sull'errore.

libreria di debug fornisce due gestore di errore generico:

  • debug.debug: Lua forniscono un prompt, consentendo agli utenti di diffondere le ragioni sbagliate
  • debug.traceback: Secondo Zhan chiamata a costruire un messaggio di errore esteso
> = Xpcall (funzione (i) di stampa (i) errore ( 'errore ..') fine, funzione print () (debug.traceback ()) End, 33) 33 pila traceback: stdin: 1: nella funzione [C]: in funzione di 'errore' stdin: 1: nella funzione [C]: in funzione 'xpcall' stdin: 1: in pezzo principale [C] :? In falso nil

xpcall Esempio 2:

function myfunction ()
   n = n/nil
end

function myerrorhandler( err )
   print( "ERROR:", err )
end

status = xpcall( myfunction, myerrorhandler )
print( status)

Il programma di cui sopra verrà visualizzato i seguenti errori:

ERROR:	test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value)
false