可能更多的是一般问题而不是.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);
}
答案 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。