2011-02-09 51 views
5

Supongamos que tengo una aplicación, donde el usuario puede proporcionar un script escrito en JavaScript para realizar algunas tareas en él. Esto se hace usando Jint. Sin embargo, una secuencia de comandos mal escrita puede provocar una excepción de desbordamiento de pila en JintEngine.Run() y, por lo tanto, bloquear toda la aplicación. Me gustaría informar al usuario sobre el error en el script.Prevenir el desbordamiento de pila Excepción del proceso de bloqueo

Intenté ejecutar Jint en otro dominio de aplicación, eso no ayudó, porque la acción predeterminada de AFAIK en SOE está saliendo del proceso. ¿Podría cambiarse de otra forma que no sea mediante el uso del alojamiento CLR?

Sé que puedo ejecutar un proceso por separado y esa es mi alternativa, sin embargo, me gustaría no hacer eso.

+1

posible duplicado de [C# captura una excepción de desbordamiento de pila] (http://stackoverflow.com/questions/1599219/c-catch-a-stack-overflow-exception) – porges

+0

He leído esto, sin embargo, no encontré una respuesta si esto puede hacerse de otra manera que utilizando CLR hosting. –

Respuesta

7

Como sospechaba, simplemente no es posible detectar una StackOverflowException generada por el tiempo de ejecución a menos que esté alojando el CLR usted mismo [1]. Como sugiere la documentación de Microsoft, la mejor opción es intentar detectar el desbordamiento de la pila antes de que suceda.

En el caso de usar Jint, esto significa encontrar la forma de engancharse al motor de ejecución y adjuntar su propio código a llamadas de método arbitrarias. Afortunadamente, una breve descripción de su documentación revela que tienen un modo de depuración que hace precisamente eso. [2]

Sin duda, ejecutando en modo de depuración significa ralentizar la ejecución de su script; Depende de usted decidir si el beneficio de la detección de desbordamientos vale la pena, y definitivamente sugiero que mida para asegurarse de que realmente sea un problema. Una posible mitigación sería permitir al usuario elegir cuándo está activo el modo de depuración.

-Mark

[1] http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx (vea las observaciones)

[2] http://jint.codeplex.com/wikipage?title=Debugging&referringTitle=Documentation

+0

Bien respondido. ¡Gracias! –

Cuestiones relacionadas