Правильная обработка ошибок в ASP.NET MVC2 - PullRequest
6 голосов
/ 14 сентября 2010

У меня есть переопределение OnException (ExceptionContext filterContext) в моем базовом контроллере, чтобы перехватывать приложение во время любых ошибок, а затем регистрировать их. Проблема, которую я получаю в своем приложении, заключается в том, что этот метод запускается четыре раза за определенные ошибки. Я расскажу вам сценарий:

Допустим, я перехожу к: http://localhost:180/someController/someAction?someId=XX

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

Здесь срабатывает OnException BaseController.

Этот нулевой объект по-прежнему возвращается в представление, где представление пытается связать его с чем-то или с чем-то другим.

OnException BaseController здесь снова запускается, для ошибки в представлении.

По сути, для меня важна только одна ошибка, но эффект замедления приводит к тому, что больше ошибок срабатывает, и спам в моем почтовом ящике: - /.

Как правильно отловить ошибку в MVC2, и если бы это не случилось со мной?

Ответы [ 2 ]

1 голос
/ 15 сентября 2010

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

Используя атрибут, вы должны иметь одно возникновение ошибки на каждое выполненное действие, и как только ошибка будет обработана, она не сработает снова.Надеюсь, это сократит количество повторяющихся сообщений об исключениях.

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

0 голосов
/ 14 сентября 2010

Сначала объясните, почему вы получаете несколько ошибок. Первой ошибкой будет попытка оперировать нулевым объектом, скорее всего, в вашей модели или контроллере. Тогда вы, вероятно, получите 2-е исключение, когда представление пытается привязаться к нулевому объекту, когда оно ожидает, что объект существует. Не совсем уверен, почему вы получаете 4 ошибки, но это может быть связано с тем, что код пытается обработать объект, который в настоящее время равен нулю.

Моим первым предложением было бы, чтобы ваш код OnException перенаправлял приложение на дружественную страницу ошибок. Вы, вероятно, просто съедаете каждое новое исключение и не позволяете web.config правильно обрабатывать страницы ошибок, если у вас есть такая настройка для отображения страницы ошибок.

Мое второе предложение - добавить некоторый код для проверки на наличие нулевых объектов, прежде чем работать с ними. Их обычно называют пунктами охраны, и они очень полезны и полезны для реализации. Затем вы можете выбрать удобный способ обработки ошибок, не регистрируя при этом исключение, если вам это не нужно, а также отображать дружественное сообщение для пользователя, помимо общего «Произошла ошибка». сообщение.

Например, в вашем контроллере вы можете проверить наличие нулевого объекта и передать альтернативное представление пользователю, если этот объект равен нулю

Function Example As ActionResult

    dim obj as Object = GetObject

    If obj is Nothing Then

        Return View("FriendlyNoObjectView")

    Else

        Return View(obj)

    End If

End Function

Я знаю, что это vb (извините, я знаю, что лучше, чем c #), но идея та же. Если вы хотите, вы все равно можете зарегистрировать это как ошибку, но тогда вы предотвратите повторение ошибки много раз. Всегда полезно обрабатывать ошибку, когда она возникает, и стараться не допускать, чтобы она всплывала до самого верха стека и вызывала множество других ошибок.

Надеюсь, это поможет, это были только мои быстрые мысли от прочтения вашего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...