我目前为我的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封电子邮件,这只是令人讨厌!)
答案 0 :(得分:0)
catch块不会调用Response.End()。一旦try {}中的某些内容抛出异常,那么try {}代码的其余部分就不会执行,因此End永远不会到达。
尝试尝试{} - catch(ex){} - finally {}代替,并在finally {}中调用Response.End(),无论是否捕获到异常,都会调用它。