我发现以下代码修改了默认的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>
}
}
答案 0 :(得分:0)
最好向用户显示“操作失败。将此12345-5445-dfee44值提供给站点支持以进行调查”并将异常转储到日志文件(或系统甚至日志,数据库)以及查找它的方式回来。
除非您的应用程序适用于非常了解您网站内部结构的开发人员,否则无论如何,每条错误消息都将基本上为“操作失败”。