处理网站上意外数据库结果的策略
本文关键字:结果 策略 数据库 意外 网站 处理 | 更新日期: 2023-09-27 18:10:03
这可能是一个一般性问题,而不是一个。net问题,但是在一个实例中,我们得到的数据库结果与基于我们对数据库结构的理解(在编写代码时)的预期相反,我们该怎么办?
取下面的代码;基于假设模型"DataRetrievals"的"DataRetrievalName"在编码时是唯一的这一事实,我不应该得到InvalidOperationException。在我这样做的场景中,它似乎被调用来将错误消息传递给视图,不是吗?对这些场景的处理/日志策略有什么想法?
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);
}
这是一个相当宽泛的问题。如何准确地处理错误实际上取决于应用程序。我将提供我所能提供的提示。
将错误消息传递给View
不要将错误传递给用户。
除非您的应用程序特别需要它(也许内部网可能是个例外),否则用户不需要知道有关错误的任何信息。他们可能不在乎,如果他们在乎,他们可能出于恶意而想知道。
不需要显示,例如:
错误9001:用户'root'@'200.100.50.25'连接超时(使用密码:NO)
也许有点夸张,但确实可以揭示一些不好的东西。
相反,应该显示一个通用且友好的错误页面,并说明发生了意想不到的事情。解释这不是用户的错,并且已经派出了一支训练有素的猴子团队来处理这种情况。不要处理控制器中的错误。
好吧,也许不是永远不会,但是应该避免控制器中的处理错误。Try-catch块非常冗长,并且会很快使代码变得丑陋和繁琐。控制器的动作应该尽可能的小和简短。
相反,我建议使用错误属性。
public class DatabaseErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
// log exception and other details
}
}
您可以分别处理不同类型的错误,或者简单地使用通用错误处理程序来捕获所有错误。无论哪种方式,你都应该尽可能详细地记录错误,以便有人可以调查和解决问题。
你可以将错误属性应用到单个动作,整个控制器甚至整个应用程序。