Правильно закодированные примеры обработки ошибок MVC 3 - PullRequest
1 голос
/ 05 октября 2011

Я из мира Winforms, где я перехватил все и обработал ошибки с сообщениями для пользователя с помощью MessageBox.Show (ex.message) или просто зарегистрировал его. Сейчас я нахожусь в мире Интернета (MVC 3) и не могу найти окончательно закодированный пример того, как правильно обрабатывать ошибки. Позвольте мне показать вам, что я использую:

Пользователь нажимает на ссылку, которая запускает действие контроллера:

Function SelectAlertKPIs() As ActionResult

    Try
        Return PartialView()

    Catch ex As Exception
        TempData("ErrorMessage") = "There was a problem during page load: " & ex.Message & vbCrLf & vbCrLf & ex.StackTrace
        Return RedirectToAction("HttpError", "Error")
    End Try

End Function

Это представление загружает сетку Telerik с привязкой AJAX, поэтому теперь привязка выполняет это действие:

<GridAction()> _
Function _SelectAlertKPIs() As ActionResult

    Try
        Return PartialView(New GridModel(AlertKPIRepository.All()))

    Catch ex As Exception
        TempData("ErrorMessage") = "There was a problem during page load: " & ex.Message & vbCrLf & vbCrLf & ex.StackTrace
        Return RedirectToAction("HttpError", "Error")
    End Try

End Function

Который вызывает этот метод для получения данных:

Public Shared Function All() As IList(Of AlertKPI)

    Dim l As IList(Of AlertKPI) = Nothing

    Try
        Using dc As New AdminAlertKPIDataContext(TripleDESSecurity.Decrypt(SharedData.PortalCnx))
            l = (From d In dc.AdminAlertKPIs Order By d.ID Select New AlertKPI With {
                .ID = d.ID,
                .KPI = d.KPI,
                .KPIName = d.KPIName,
                .KPIDescription = d.KPIDescription
            }).ToList
        End Using

        Return l

    Catch ex As Exception
        Throw
    Finally
        If Not l Is Nothing Then l = Nothing
    End Try

End Function

Это мои действия ErrorController:

Public Function HttpError() As ActionResult

    Dim s As String = String.Empty

    s = TempData("ErrorMessage")
    ViewData("ErrorMessage") = "An error occurred. " & s

    Return PartialView("Error")

End Function

Public Function Http404() As ActionResult

    Try
        ViewData("ErrorMessage") = "The page you requested could not be found"

        Return View("Error")

    Catch ex As Exception
        Return View("Error")
    End Try

End Function

Это то, что у меня есть в моем web.config:

<customErrors mode="On" defaultRedirect="/Error/HttpError">
  <error statusCode="404" redirect="/Error/Http404" />
</customErrors>

Теперь, если я добавлю код в действие моего контроллера для преднамеренного выброса:

Throw New HttpUnhandledException

Затем он попадает в блок catch, а затем направляется к действию HttpError. Дважды! и тогда мое представление Error.aspx никогда не открывается, вместо этого я получаю либо отсутствие результата JSON, либо внутреннюю ошибку сервера 500 ... это не имеет смысла для меня. По сути, я не знаю, что я делаю.

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

1 Ответ

0 голосов
/ 05 октября 2011

Вам нужно заглянуть в [HandleErrorAttribute] - нет необходимости добавлять ваши методы действий в блоки try try.Возможно, вы захотите реализовать свой собственный атрибут обработчика ошибок для дополнительной регистрации - это то, что я делаю сегодня.Это сегодняшняя статья об обработке исключений: нажмите здесь

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

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