Siempre que escriba programas (desde los más sencillos hasta los más avanzados), inevitablemente se encontrará con errores que provocan un mal funcionamiento del programa. Debido a la naturaleza del entorno de pruebas, puede resultar un poco complicado saber exactamente qué está ocurriendo. A continuación le ofrecemos algunos consejos que le pueden servir para diagnosticar problemas en sus scripts.
Depuración «a la manera de los cavernícolas»
Dado que no dispone de acceso directo al entorno en el que se ejecutan los scripts, puede recurrir a numerosas llamadas a la función `log() ` para saber qué está sucediendo en su programa. Por ejemplo, si no está seguro de por qué un token no funciona correctamente y desea obtener información sobre los valores que se están manipulando, podría hacer lo siguiente:
on("change:graphic:left", function(obj) {
//¿Cuál es el valor de «left» del objeto que se pasa a esta función?
log(obj.get("left"));
obj.set("left", obj.get("left") + 70);
//¿Cuál es el valor ahora?
log(obj.get("left"));
//También puede depurar objetos completos para ver una lista de sus atributos actuales
log(obj);
});
Encontrará el resultado de sus comandos «log()» en la «Consola de salida de Mod», que se encuentra en la página «Configuración de scripts de Mod» de su campaña.
Solo para Mod Script Sandbox v1.5. Siempre que sea posible, los mensajes de error incluyen un objeto de contexto para que pueda ver qué objeto de Roll20 se ha visto afectado (tipo e identificador):
ERROR: La función toBelow() debe invocarse con un objeto gráfico, de texto o de trazado de Roll20. Se ha llamado con [personaje de Roll20 -NM0tVij02hIfnoTdihc].
Bloqueos por error
El entorno de pruebas se recuperará automáticamente de pequeños errores en su script reiniciándolo cuando sea necesario. No obstante, si detecta un error grave del que no puede recuperarse, en lugar de limitarse a reiniciar su script una y otra vez —lo que solo provocaría que siguiera dando error—, aplicará un «bloqueo por error» a su campaña, lo que impedirá que sus scripts de mod se ejecuten hasta que se resuelva el error. Si sus scripts han sido bloqueados por un error, verá un mensaje como este en la página «Configuración de scripts de mods»:
¡No se preocupe! Solo tiene que realizar los cambios necesarios en sus scripts para intentar resolver el problema y, a continuación, haga clic en el botón «Guardar script ». Al hacerlo, se eliminará el bloqueo por error y el entorno de pruebas intentará ejecutar sus scripts de nuevo. Si se produce otro error, se volverá a aplicar el bloqueo por error. Puede repetir este proceso tantas veces como sea necesario para solucionar el error; nunca se le impedirá borrar los bloqueos por error por haber fallado demasiadas veces.
Pila de llamadas específica del script
Las pilas de llamadas muestran los nombres de los scripts y los números de línea.
Entre los errores se encuentra una pila de llamadas reescrita en la que se indican el nombre del script y la línea, y no el archivo de entorno de pruebas concatenado. Los scripts manuales se etiquetan como «SCRIPT», seguido del nombre que haya asignado a la pestaña, el número de pestaña, la línea en la que se produjo el error y el desplazamiento de columna:
| Parte | Ejemplo |
|---|---|
| Etiqueta | GUION |
| Special Ability Name | Guión de «Bad Actor» |
| Pestaña | 85 |
| Línea | 3 |
| Columna | 13 |
Ejemplo: SCRIPT: Script de «Bad Actor» [Pestaña 85]:3
Los scripts de biblioteca de un solo clic son iguales, pero la etiqueta es «1-CLICK»:
Se traducirá toda la pila de llamadas, por lo que, si dispone de varios scripts que llaman a otros scripts, podrá saber dónde se está produciendo todo ello.
Se ha detectado un posible bucle infinito. Más detalles
Si el entorno de pruebas deja de enviar señales de actividad, se apaga y puede producirse un bucle infinito. Podrá ver el evento y el lugar en el que se registró la función de devolución de llamada que se estaba ejecutando. Esto contribuye en gran medida a localizar dónde se produce el problema y debería agilizar considerablemente la búsqueda de soluciones.
- Evento:
change:graphic - Llamada de retorno: en la línea 37 del script «Bad Actor»
Errores comunes
A continuación se muestran algunos de los errores más comunes:
myvar no está definido
on("ready", function() {
var myVar;
log(myvar);
});
Aunque el mensaje de error indica «no definido», lo que realmente ha ocurrido es que la variable no está declarada. Una de las causas más comunes de esto es un error tipográfico en el nombre de una de sus variables, como por ejemplo, omitir una letra mayúscula.
No se puede leer la propiedad «myProperty» o no se puede llamar al método «myMethod»
on("ready", function() {
var myVar;
log(myVar.myProperty);
log(myVar.myMethod());
});
myVar no está definida, por lo que el script no sabe cómo gestionar su intento de acceder a una propiedad de myVar. Esto probablemente se deba a uno de los siguientes motivos:
- Ha intentado buscar un objeto con
«getObj» o«findObjs», pero el resultado ha sido«undefined». Realice algunas comprobaciones de errores para asegurarse de que su variable está definida antes de acceder a sus propiedades. - Su variable se está definiendo de forma condicional (mediante una serie de sentencias
«if»o algo similar), y ninguna de sus condiciones se ha cumplido, por lo que su variable quedó declarada, pero nunca se definió. Asegúrese de tener condiciones para todas las posibilidades, cree una opción predeterminada o realice una comprobación de errores para asegurarse de que su variable está definida antes de acceder a sus propiedades.
Los objetos de Roll20 también necesitan métodos «get » y «set». «obj.left» no corresponde a la posición de la mesa; utilice «obj.get("left")».
Token inesperado
Le falta un carácter o tiene un carácter de más. Esto puede deberse a que se ha olvidado una coma entre una lista de propiedades en un objeto o elementos en una matriz, o a que hay un paréntesis de cierre de más o de menos al final de una llamada a un método anidado complicado.
_displayname devuelve «undefined», mientras que get("_displayname") devuelve un nombre
Para acceder a la mayoría de las propiedades de los objetos de Roll20, es necesario utilizar los métodos get() y set(). Al utilizar get(), puede omitir el guión bajo inicial en las propiedades de solo lectura: obj.get("displayname") es lo mismo que obj.get("_displayname"). obj._displayname no lo es.
Si sigue teniendo problemas, no dude en publicar un mensaje en nuestro foro de scripts de mods. Incluya el texto del error de la consola y una breve descripción de lo que esperaba que ocurriera.