Latest web development tutorials

Lua Gestion des erreurs

la gestion des erreurs exécution du programme est nécessaire, dans nos opérations de fichiers, transfert de données et d'un service Web appel apparaîtra dans des erreurs inattendues. Si vous ne faites pas attention à traiter les messages d'erreur, selon les informations fuira, ne peut pas fonctionner et ainsi de suite.

Les langages de programmation, la gestion des erreurs est nécessaire. types d'erreurs sont:

  • erreur de syntaxe
  • Erreur d'exécution

erreur de syntaxe

Les erreurs de syntaxe sont généralement dues à des composantes du programme (tels que les opérateurs, expressions) causés par une mauvaise utilisation. Un exemple simple est la suivante:

-- test.lua 文件
a == 2

Le code ci-dessus est exécutée à la suite de:

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

Comme vous pouvez le voir, il y a eu plus d'une erreur de syntaxe, un signe "=" suivi par deux signe "=" est différent. A "=" est l'expression d'affectation de deux "=" est l'opération de comparaison.

Un autre exemple:

for a= 1,10
   print(a)
end

Le programme ci-dessus apparaissent les erreurs suivantes:

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

Les erreurs de syntaxe est plus facile que l'exécution d'une erreur de programme, erreur d'exécution incapable de localiser les erreurs spécifiques, les erreurs grammaticales que nous pouvons résoudre rapidement, comme les exemples ci-dessus aussi longtemps que nous faisons dans l'instruction for peuvent être ajoutés:

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

Erreur d'exécution

Exécutez le programme peut effectuer erreur est normal, mais il va afficher un message d'erreur. Les exemples suivants parce que les erreurs de saisie des paramètres, l'erreur d'exécution du programme:

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

add(10)

Lorsque nous compiler et exécuter le code suivant, le compilateur peut être couronnée de succès, mais au moment de l'exécution produira l'erreur suivante:

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]: ?

Le message d'erreur suivant est dû au fait que le programme n'a pas le paramètre b.


Gestion des erreurs

Nous pouvons utiliser deux fonctions: assert et erreurs pour gérer les erreurs. Des exemples sont les suivants:

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

Le programme ci-dessus apparaissent les erreurs suivantes:

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 ?

Exemple affirmer vérifie d'abord le premier argument, si aucun problème, affirment ne fait rien, sinon, le second argument pour affirmer message d'erreur levée.

fonction d'erreur

Syntaxe:

error (message [, level])

: Termine la fonction en cours d'exécution, et renvoie le contenu du message comme le message d'erreur (fonction d'erreur ne reviendra)

En règle générale, l'erreur sera des informations supplémentaires sur le message d'erreur à la position de la tête.

paramètre de niveau indique la position de se tromper:

  • Level = 1 [par défaut]: Pour appeler erreur (fichier + numéro de ligne)
  • Level = 2: fonction qui appelle la fonction d'erreur indiquée
  • Niveau = 0: ne pas ajouter l'emplacement d'erreur

pcall et xpcall, debug

la gestion des erreurs Lua, vous pouvez utiliser la fonction pcall (appel protégé) pour envelopper le code à exécuter.

pcall recevoir une fonction et que vous voulez passer un paramètre de ce dernier, et exécuté, le résultat: il y a une erreur, pas d'erreur, ou la valeur de retour de vrai ou faux, ErreurInfo.

La syntaxe est la suivante

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

Exemple simple:

> =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 dans un "mode protégé" pour appeler le premier argument, donc pcall fonction de capture peut effectuer toutes les erreurs.

Généralement quand une erreur se produit, il espère retrouver avec plus d'informations de débogage, pas seulement là où l'erreur est survenue. Mais les rendements pcall, il a détruit une partie du contenu de l'appel Zhan.

Lua fournit xpcall fonction, xpcall réception d'un second paramètre - un gestionnaire d'erreur quand une erreur se produit, gestionnaire d'erreurs Lua sera appelé avant d'appeler show Zhan pour voir (se détendre), alors vous pouvez utiliser cette fonction dans la bibliothèque de débogage pour obtenir des informations supplémentaires sur l'erreur.

bibliothèque de débogage fournit deux gestionnaire d'erreur générique:

  • debug.debug: Lua fournir une invite, permettant aux utilisateurs de se propager les mauvaises raisons
  • debug.traceback: Selon Zhan appel à construire un message d'erreur étendu
> = Xpcall (function (i) impression (i) erreur ( «erreur ..») fin, function () print (debug.traceback ()) fin, 33) 33 pile retraçage: stdin: 1: en fonction [C]: la fonction 'error' stdin: 1: en fonction [C]: dans la fonction 'xpcall' stdin: 1: en morceau principal [C] :? En fausse nil

xpcall Exemple 2:

function myfunction ()
   n = n/nil
end

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

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

Le programme ci-dessus apparaissent les erreurs suivantes:

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