【发布时间】:2016-03-07 02:09:32
【问题描述】:
我目前为我的 MVC 4 项目设置了一个全局错误处理程序。我们还将这个错误处理程序用于我们拥有的一些 Web 表单项目。在将错误记录到数据库并向适当的人发送错误电子邮件后,它会调用此方法,将我们的自定义错误页面发送给最终用户。
public static void WriteErrorResponse(string response)
{
//Cleanup and send response to user
HttpContext.Current.Server.ClearError();
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "text/html";
HttpContext.Current.Response.Write(response);
HttpContext.Current.Response.End();
}
我遇到了一个例子,我们的标准错误消息不足以让我正确地跟踪我们的一个网站的问题。所以我想将函数定义包装在 try catch 中,并在 catch 块中调用这个函数。这个 catch 语句看起来像这样
catch (System.Data.SqlClient.SqlException ex)
{
string message = "<strong>Query Executed:</strong> <br>" + sql + "<br><br><br><strong>Query Variables:</strong><table><tbody>";
foreach(var rv in rvs)
{
message += "<tr><th>" + rv.VariableName + "</th><td>" + variables[rv.VariableName] + "</td></tr>";
}
message += "</tbody></table>";
Errors.Error.EmailError(message, ex);
Errors.Error.LogError(message, ex);
Errors.Error.Respond500();
return null;
}
Errors.Error.Respond500() 构建响应字符串,然后调用上面显示的WriteErrorResponse(string) 方法。
所有这些实际上都有效,错误消息会显示给用户,我会收到更详细的错误消息。问题是请求继续执行,并且由于将变量设置为null,或者在标头已经发送后尝试设置标头等而产生第二个错误...
所以现在我留下一个问题,为什么Response.End() 没有像文档所说的那样结束请求。还有一个不涉及我重新抛出错误的解决方案(在这种情况下会发送 2 封电子邮件,这很烦人!)
【问题讨论】:
标签: c# .net asp.net-mvc-4 error-handling