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

本文关键字:结果 策略 数据库 意外 网站 处理 | 更新日期: 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
    }
}

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

你可以将错误属性应用到单个动作,整个控制器甚至整个应用程序。