MVC 3错误处理的正确编码示例

时间:2011-10-05 14:09:50

标签: vb.net asp.net-mvc-3 error-handling

我来自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

此视图使用AJAX绑定加载Telerik网格,因此现在绑定运行此操作:

<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 :(得分:0)

你需要研究[HandleErrorAttribute] - 没有必要用try catch块来规划你的动作方法。您可能希望为其他日志记录实现自己的错误处理程序属性 - 这就是我今天所做的。这是今天关于异常处理的帖子:click here

您的Web配置适用于在MVC应用程序管道之外发生的异常。 IIS将能够读取Web配置,然后将用户重定向到正确的页面。其他人,如果我错了,请纠正我,因为我今天才开始看这个。