对于Asp.Net MVC的一些数据库异常,显示错误的错误消息?

时间:2014-03-22 23:47:46

标签: c# asp.net asp.net-mvc asp.net-mvc-5

我发现以下代码修改了默认的error.cshtml,以显示一些数据库错误的好消息;例如,它显示了一个很好的"不能在YYYYY"中插入重复值(xxxx)。而不是一般的错误消息,以防止用户一次又一次地令人沮丧地继续插入相同的值。

然而,代码似乎非常难看。有没有更好的方法来显示最终用户的例外错误消息?

@model System.Web.Mvc.HandleErrorInfo
@using System.Text.RegularExpressions;

@{
    ViewBag.Title = "Error";
}

<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
@{
    const string FK = @"^The DELETE statement conflicted with the REFERENCE constraint.*? table ""(?<name>[^""]*)"",";
    const string DuplicateKey = @"^Cannot insert duplicate key row.*?The duplicate key value is \((?<value>[^(]*)\)";
    var ex = Model.Exception.InnerException;
    if (ex != null && ex.InnerException != null) 
    {
        string message;
        if (Model.ActionName == "Delete")
        {
            var re = new Regex(FK);
            var match = re.Match(ex.InnerException.Message);
            if (match.Success) 
            { 
                message = string.Format(
                    "The {0} has been used in {1}. Cannot delete the {0} unless referenced record(s) is(are) deleted.", 
                    Model.ControllerName, match.Groups["name"].Value.Replace("dbo.", ""));
            }
            else
            {
                message = ex.InnerException.Message;
            }
        }
        if (Model.ActionName == "Create")
        {
            var re = new Regex(DuplicateKey);
            var match = re.Match(ex.InnerException.Message);
            if (match.Success)
            {
                message = string.Format("Cannot insert duplicated value ({1}) in {0}.", 
                    Model.ControllerName, match.Groups["value"].Value);
            }
            else
            {
                message = ex.InnerException.Message;
            }            
        }
        else
        {
            message = ex.InnerException.Message;
        }

        //.........

        <h3 class="text-danger">@message</h3>
    }
}

1 个答案:

答案 0 :(得分:0)

最好向用户显示“操作失败。将此12345-5445-dfee44值提供给站点支持以进行调查”并将异常转储到日志文件(或系统甚至日志,数据库)以及查找它的方式回来。

除非您的应用程序适用于非常了解您网站内部结构的开发人员,否则无论如何,每条错误消息都将基本上为“操作失败”。