Предотвратить исключение переполнения стека от сбоя процесса - PullRequest
5 голосов
/ 10 февраля 2011

Предположим, у меня есть приложение, в котором пользователь может предоставить скрипт, написанный на JavaScript, для выполнения какой-либо задачи в нем. Это делается с помощью Jint. Однако плохо написанный сценарий может вызвать исключение переполнения стека в JintEngine.Run() и, следовательно, привести к сбою всего приложения. Я бы хотел сообщить пользователю об ошибке в скрипте.

Я попытался запустить Jint в другом домене приложения, но это не помогло, поскольку действие AFAIK по умолчанию для SOE завершается. Может ли он быть изменен иначе, чем с помощью хостинга CLR?

Я знаю, что могу запустить отдельный процесс, и это мой запасной вариант, однако я бы не хотел этого делать.

1 Ответ

7 голосов
/ 10 февраля 2011

Как вы и предполагали, просто невозможно отловить исключение StackOverflowException, сгенерированное средой выполнения, если вы сами не используете CLR [1]. Как следует из документации Microsoft, лучше всего попытаться обнаружить переполнение стека до того, как это произойдет.

В случае использования Jint это означает, что нужно найти способ подключиться к механизму выполнения и присоединить свой собственный код к произвольным вызовам методов. К счастью, краткий обзор их документации показывает, что у них есть режим отладки, который делает именно это! [2]

Без сомнения, работа в режиме отладки означает замедление выполнения скрипта; Вам решать, стоит ли выгода от обнаружения переполнений, и я определенно предлагаю измерение этого штрафа, чтобы убедиться, что это действительно будет проблемой. Одним из возможных смягчений было бы разрешение пользователю выбирать, когда активен режим отладки.

-Марк

[1] http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx (см. Примечания)

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

...