2011-05-11 18 views
6

Estoy haciendo eval en el contenido del archivo. El archivo está hecho de etiquetas que analizo. Cada línea tiene una etiqueta, y tengo un proc definido para cada etiqueta, por lo que el eval tiene éxito. Sin embargo, a veces los usuarios agregan etiquetas nuevas y luego falla el comando eval, debido a un comando desconocido.Prevenir que Tcl se bloquee en el comando desconocido

¿Hay alguna manera de evitar que Tcl se bloquee al intentar eval un comando desconocido?
Lo ideal es que me permita sustituirlo por mi propio comportamiento definido, como por ejemplo el error y continuar con el eval.


EDITAR:

Por desgracia, sólo se puede utilizar Tcl 8.4.
He intentado hacer lo siguiente, as suggested here:

proc handle_unknown_label {cmd args} { ... } 

y luego:

rename unknown _old_system_unknown 
rename handle_unknown_label unknown 

catch {set ret [eval $x]} err 

rename unknown handle_unknown_label 
rename _old_system_unknown unknown 

pero sigo teniendo el mismo comportamiento para el eval, e imprime los siguientes errores:

procedimiento desconocido es un proceso protegido y no cambiará de nombre
procedimiento desconocido es un pro tegido proc y no conseguirá anulado
procedimiento desconocido es un proc protegida y no se renombran
procedimiento desconocido es un proc protegido y no conseguirán anulado

+1

no aplicable, pero si está leyendo un archivo y lo está evaluando, también puede simplemente buscar el archivo en su lugar, ¿no? –

+1

en qué entorno está este intérprete Tcl? No estoy familiarizado con ese error de "proc protegido". –

+0

@glenn Interesante. Entonces, ¿podría tratarse de algo inhabilitado en mi empresa? –

Respuesta

2

implementar su propio comando llamado unknown, que toma como argumentos todas las palabras que componen el comando que no se puede encontrar y sus args:

proc unknown {cmdName args} { 
    puts "UNKNOWN COMMAND: $cmdName" 
    puts "CALLED WITH ARGUMENTS: $args" 
} 

eso es todo lo que tiene que hacer, aunque se puede conseguir más elegante con el uso de namespace unknown.

+0

¡Gracias! ¿Puedes dar un ejemplo de cómo usar el comando 'namespace unknown'? Me gustaría cambiar el manejo de comandos desconocidos temporalmente, así que me gustaría saber cómo cambiar y luego restaurar el manejo predeterminado. –

+0

por favor vea mi edición –

+0

@Amir: Alguien lo bloqueó mucho, así que no hay mucho que podamos sugerir (aparte de quizás leer los documentos en el sistema de alojamiento). Le hemos dicho el mecanismo estándar en el idioma ... –

3

Creo que estoy diciendo lo obvio, pero eval 'un archivo es peligroso: cualquier usuario puede incrustar [exec whatever they wish] en dicho archivo.

Mucho mejor sería leer esas "etiquetas" y usar un interruptor gigante o un mapa hash o lo que sea para ejecutar un comando predeterminado. La captura de "etiquetas" no existentes también se convierte en un problema.

+0

Agradezco la sugerencia. Sin embargo, esta no es realmente una respuesta a mi pregunta y creo que esto debería ser un comentario. –

+0

Es una muy buena respuesta TBH. Mantenga una lista de todas las etiquetas válidas, si la que acaba de leer no está en esa lista, llame a un proceso de su elección. Soluciona el problema exactamente y agrega seguridad al arranque. – ZoFreX

Cuestiones relacionadas