Ответ WebAPI StackOverflowException

Когда в WebAPI возникает необработанное исключение, это обычно регистрируется ELMAH (в моей установке), и объекту jqXHR возвращается разумный ответ, который я могу прочитать.

Но у меня была (теперь решенная) проблема с синтаксическим анализом плохо структурированного JSON, который приводил к StackOverflowException в методе Deserialize (код ниже, только для контекста).

Моя проблема в том, что это не рассматривалось как необработанное исключение, а вместо этого (я думаю, IIS) вернуло ответ 500 с HTML-страницей «Внутренняя ошибка сервера» с сообщением «Служба временно недоступна».

Следовательно, это означало, что мой обработчик ошибок JavaScript дал сбой, так как он ожидал JSON, а не HTML в ответе.

Является ли StackOverflowException особым случаем, который по своей природе не может рассматриваться как необработанное исключение, как любое другое, или существуют другие ситуации, когда ELMAH не регистрирует исключение, что также приводит к возврату HTML-сообщения, когда JSON ожидал?

Или это означает, что в WebAPI вы должны поместить код try/catch вокруг всего кода и предотвратить возникновение необработанных исключений?

        private Models.Stream DeserializeStream(FileInfo dataFileInfo)
    {
        Models.Stream stream;

        using (var streamReader = new StreamReader(dataFileInfo.FullName))
        {
            using (var reader = new JsonTextReader(streamReader))
            {
                stream = Serializer.Deserialize<Models.Stream>(reader);
            }
        }

        return stream;
    }

Просто во избежание сомнений, я не ищу решение, почему возникло исключение (у меня это есть), просто как лучше всего обрабатывать исключения такого типа).


person Appetere    schedule 04.12.2013    source источник


Ответы (1)


Да, StackOverflowException — это один из дескрипторов особых случаев, которые нельзя обработать обычным способом.

здесь есть некоторая информация о том, как с этим справиться немного.

person Will Dean    schedule 04.12.2013
comment
Спасибо Уилл. Полезно знать, что try/catch не будет перехватывать исключение StackOverflowException, созданное средой выполнения, начиная с .NET2.0. Сэкономил мне время, обертывая мои услуги с ними. - person Appetere; 05.12.2013