Предотвратить исключение переполнения стека от сбоя процесса
Предположим, у меня есть приложение, в котором пользователь может предоставить скрипт, написанный на JavaScript, для выполнения некоторой задачи в нем. Это делается с помощью Jint. Однако плохо написанный скрипт может вызвать исключение переполнения стека в JintEngine.Run()
и, следовательно, сбой всего приложения. Я бы хотел сообщить пользователю об ошибке в скрипте.
Я попытался запустить Jint в другом домене приложения, но это не помогло, так как действие AFAIK по умолчанию для SOE - это выход из процесса. Может ли это быть изменено иначе, чем с помощью хостинга CLR?
Я знаю, что могу запустить отдельный процесс, и это мой запасной вариант, но я бы не хотел этого делать.
1 ответ
Как вы и подозревали, просто невозможно поймать исключение StackruException, сгенерированное средой выполнения, если вы сами не используете CLR [1]. Как следует из документации Microsoft, лучше всего попытаться обнаружить переполнение стека до того, как это произойдет.
В случае использования Jint это означает поиск способа подключиться к механизму выполнения и присоединить свой собственный код к произвольным вызовам методов. К счастью, краткий обзор их документации показывает, что у них есть режим отладки, который делает именно это! [2]
Без сомнения, работа в режиме отладки означает замедление выполнения скрипта; Вам решать, стоит ли выгода от обнаружения переполнения, и я определенно предлагаю измерить этот штраф, чтобы убедиться, что он действительно будет проблемой. Одним из возможных смягчений было бы разрешение пользователю выбирать, когда активен режим отладки.
-Отметка
[1] http://msdn.microsoft.com/en-us/library/system.stackruexception.aspx (см. Примечания)
[2] http://jint.codeplex.com/wikipage?title=Debugging&referringTitle=Documentation