Publicidad

Anuncios Google

[Minituto] Obtiene los códigos de error de tu aplicación Lua

[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).


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Daklon

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

Imagen de NEKERAFA

XDDD

¿¿¿Por que lo dices??? Jejejejeje

Imagen de Daklon

por esto xD: function

por esto xD:

function main()
 
end

Imagen de NEKERAFA

XDD

Esque eso ya lo hice a proposito jajaja

Imagen de Daklon

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

Imagen de NEKERAFA

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

Imagen de Dioni0396

De puta madre

te superaste a ti mismo.

Porque lo pones en ingles los Strings, no seria mejor en español?

Imagen de NEKERAFA

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).

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.