在您的网站上处理意外数据库结果的策略

时间:2014-06-23 22:40:04

标签: c# asp.net-mvc entity-framework

可能更多的是一般问题而不是.NET问题,但是在我们根据对数据库结构的理解(编写代码时)得到的数据库结果与预期相反的情况下,我们该怎么做?

采取以下代码;基于模型“DataRetrievals”的“DataRetrievalName”在编码时被假定为唯一的事实,我永远不会得到InvalidOperationException。在我这样做的场景中,似乎有点打电话来将错误消息传递给View,不是吗?关于处理/记录这些方案的策略的想法?

    public ViewResult Edit(string resultSetToFind)
    {

        DataEntities db = new DataEntities();
        DataResultSet viewModel = new DataResultSet();
        try
        {
            //single resultset not found
            viewModel.ResultSet = db.DataRetrievals.Single(r => r.DataRetrievalName == resultSetToFind);

        }
        catch (System.ArgumentNullException exception) {
            //resultset not found
            viewModel.ErrorMessage=System.Web.Http.WebHost.Properties.ErrorMessages.ResultSet_NameNotFound;                 
        }
        catch (System.InvalidOperationException exception) { 
            //more than one entry found, this should never happend
            viewModel.ErrorMessage = System.Web.Http.WebHost.Properties.ErrorMessages.ResultSet_DuplicateNameFound;
        }
        return View(viewModel);

    }

1 个答案:

答案 0 :(得分:1)

这是一个非常广泛的问题。您如何处理错误取决于您的应用程序。我会提供一些可以提示的内容。

  

将错误消息传递给视图

不要将错误传递给用户。

除非您的应用程序特别要求它(可能内联网可能是例外),否则用户不需要知道任何有关错误的信息。他们可能不在乎,如果他们这样做,他们可能会因为恶意原因而想知道。

没有必要显示,例如:

  

错误9001:用户' root' @' 200.100.50.25'的连接超时(使用密码:否)

或许夸张,但可以揭示出一些不好的东西。

相反,请显示一个通用且友好的错误页面,并说明发生了意外情况。解释这不是用户和a team of highly trained monkeys has been dispatched to deal with the situation的错误。

不要处理控制器中的错误。

好吧,也许不是从不,但应该避免在控制器中处理错误。 Try-catch块非常冗长,可以快速使代码变得丑陋和繁琐。控制器的行动应该尽可能小而且简短。

相反,我建议使用Error Attributes

public class DatabaseErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        // log exception and other details
    }
}

您可以单独处理不同类型的错误,或者只使用通用错误处理程序捕获所有内容。无论哪种方式,您都应该尽可能详细地记录错误,以便有人可以调查并解决问题。

您可以将错误属性应用于单个操作,整个控制器甚至entire application