[Minituto] Obtiene los códigos de error de tu aplicación Lua
Hola a tod@s. Hoy vamos a aprender como obtener los códigos de error de nuestras aplicaciones, ya sea en forma de archivo o por medio de la pantalla. Si quieres intentar saber en que te equivocas sigue leyendo.
LuaPlayerPS3 no incluye salida de errores por pantalla, por lo que los errores se convierten en un estorbo ya que no se sabe donde fallamos. Ni que fuéramos adivinos XD. Pues con este tutorial podremos hacer que los errores se muestren de la misma forma que en LuaHM. Los errores no se mostrarán al 100%, ya que si el error ya esta en el inicio del archivo ya no se muestra, pero muchos de ellos los podremos ver.
Primero, saber que yo lo voy a hacer en 1.0v, muy antigua pero es que no lo puedo ver en PS3. Es fácil de pasar a la versión 2.0v, ya que los comando son globales. Pues vamos al meollo.
Lua tiene una función llamada pcall()
que lo que hace es iniciar una función en modo protegido, y devuelve el estado de la función y si ha ocurrido un error el mensaje del error. Con esto, teóricamente, podríamos manejar errores y evitar que se propaguen por todo el programa, cosa que si LuaPlayerPS3 encuentra un error se cierra.
Con esto vamos a hacer un script que nos muestre el mensaje de error, y después un ejemplo para ver que funciona. Este es el script:
InitGFX(720, 480) initPads(7) function main() -- Aquí tu código principal end estado, msg = pcall(main) -- Llamada a la función main en modo protegido if not estado then -- Si hay algun error while true do beginGFX() DrawText(10, 10, "Ha ocurrido un error: "..msg) DrawText(10, 20, "Presione START para salir o SELECT para reiniciar.") endGFX() if start(0) >= 1 then break elseif select(0) >= 1 then dofile("./app.lua") end end end
He llamado main a la función principal, aquí pondremos nuestro código que va a ser llamado por la función pcall en modo protegido. Después, como podéis ver le doy dos variables a pcall, status y msg. No son las mismas, ya que pcall, si existe más de una variable, escribe en la primera si ha fallado y en la segunda el mensaje de error. Después el while es fácil, muestra el mensaje de error y otro diciendo que se presione start para salir o select para reiniciar.
Ahora vamos a probar que funciona, un error simple:
InitGFX(720, 480) initPads(7) function main() a = a + nil -- Error claro, no puedo sumar nada a nada, "attempt to perform arithmetic on global 'a' (a nil value)" XD end estado, msg = pcall(main) -- Llamada a la función main en modo protegido if not estado then -- Si hay algun error while true do beginGFX() DrawText(10, 10, "Ha ocurrido un error: "..msg) DrawText(10, 20, "Presione START para salir o SELECT para reiniciar.") endGFX() if start(0) >= 1 then break elseif select(0) >= 1 then dofile("./app.lua") end end end
Y... tachan, mensaje de error:
Click para agrandar
Edición de errores
Si seguimos este tutorial de pspgorrister, veremos que el tiene una función para desglosar los mensajes, pues nosotros vamos a hacer algo más sencillo y que se pueda entender. Aquí llegan más funciones.
string.find()
Esta función lo que hace es buscar una secuencia o carácter (letras, números, símbolos, nuevas líneas...) en un string y nos devuelve la posición en el string.
string.sub()
Esta otra lo que hace es devolvernos una copia del string, poniendo los argumentos desde y hasta solo nos devuelve la parte del string que se encuentre en esa línea.
Con esto vamos a analizar nuestro error y vamos a intentar dividirlo en archivo, línea y mensaje de error:
Divisores. Antes de nada vamos a localizar los divisores. Con un string.find localizaremos el primero. Para el segundo ponemos el mismo string.find, pero indicándole que busque desde la posición del primer divisor, o localizara el mismo:
posicion1 = string.find(msg, ":") -- El primer argumento es el string, el segundo es lo que hay que buscar y el tercero es desde que posición del string posicion2 = string.find(msg, ":", posicion1+1)
Archivo. Vamos a utilizar el string.sub para copiar el texto que hay desde el inicio del error hasta el primer divisor:
archivo = string.sub(msg, 1, posición1-1) -- El primer argumento es el string, el segundo es la posición de inicio y el tercero es la posición final
Linea. Utilizamos otro string.sub para copiar el texto que esta entre el primer divisor y el segundo:
linea = string.sub(msg, posicion1+1, posicion2-1)
Mensaje de error: Esto es más difícil, pero no mucho. Resulta que entre el segundo divisor y el mensaje de error hay un espacio, por lo que al copiar el texto tendremos que poner el principio en el divisor más 1, refiriéndonos al espacio:
msgerror = string.sub(msg, posicion2+2)
Ahora con esto vamos aplicarlo en varias líneas, así que utilizando el código de antes:
InitGFX(720, 480) initPads(7) function main() a = a + nil -- Error claro, no puedo sumar nada a nada, "attempt to perform arithmetic on global 'a' (a nil value)" XD end estado, msg = pcall(main) -- Llamada a la función main en modo protegido if not estado then -- Si hay algun error posicion1 = string.find(msg, ":") posicion2 = string.find(msg, ":", posicion1+1) archivo = string.sub(msg, 1, posicion1-1) linea = string.sub(msg, posicion1+1, posicion2-1) msgerror = string.sub(msg, posicion2+2) while true do beginGFX() DrawText(10, 10, "Ha ocurrido un error") DrawText(10, 20, "Archivo: "..archivo) DrawText(10, 30, "Linea: "..linea) DrawText(10, 40, "Error: "..msgerror) DrawText(10, 60, "Presione START para salir o SELECT para reiniciar.") endGFX() if start(0) >= 1 then break elseif select(0) >= 1 then dofile("./app.lua") end end end
Click para agrandar
NekeOS, el nuevo shell para PSP
PS4 500GB OFW, PS3 320GB OFW, PS3 500GB OFW, PSP 6.39 PRO-C Fix4.
Sony Xperia Z1 Compact con Android 5.1.1
Portatil Lenovo z50-70 Intel® Core™ i7-4510U y NVIDIA GeForce 840M con Elementary OS 0.3.2 Freya (64 bits) y Windows 10 (64 bits).
muchas gracias por el tuto
muchas gracias por el tuto viene muy bien xD sobre todo cuando tienes algun error tonto que te tira a la basura horas delante delante del ordenador escribiendo codigo xD
PD:ya tienes C metido en el subconsciente xD
Neotecos.com
XDDD
¿¿¿Por que lo dices??? Jejejejeje
por esto xD: function
por esto xD:
XDD
Esque eso ya lo hice a proposito jajaja
Buf entonces es mas grave de
Buf entonces es mas grave de lo que pensaba xD
Nah es broma y me callo ya que me voy por las ramas que esto es programacion no off topic xD
Neotecos.com
Jajajaja
Esque no sabía que nombre darle, así que pille de C
Que pendejo el que ha hecho
Que pendejo el que ha hecho el LuaPlayer para PS3. Buen tuto. xD
De puta madre
te superaste a ti mismo.
Porque lo pones en ingles los Strings, no seria mejor en español?
Sorry
I don't speak spanish... lol
Na, esque ya es costumbre escribir en inglés, despues llego al examen y cateo jajajajaja, pero si siempre estoy escribiendo if y pongo is...
Editado: Ahora en español y terminado
NekeOS, el nuevo shell para PSP
PS4 500GB OFW, PS3 320GB OFW, PS3 500GB OFW, PSP 6.39 PRO-C Fix4.
Sony Xperia Z1 Compact con Android 5.1.1
Portatil Lenovo z50-70 Intel® Core™ i7-4510U y NVIDIA GeForce 840M con Elementary OS 0.3.2 Freya (64 bits) y Windows 10 (64 bits).