是否可以在C#中重载try / catch语句?如果做不到,是否可以继承并制作类似的功能?
我们正在向现有的Web应用程序添加ELMAH,代码会广泛使用try / catches,在验证摘要中显示错误,而不是显示错误页面。由于错误在catch语句中被捕获,因此ELMAH假定正在处理错误;实际上,它们只是以更加流畅的方式展示。
以下是它正在做的事情的样本:
try
{
//code here...
}
catch (Exception ex)
{
customValidatorError.IsValid = false;
customValidatorError.ErrorMessage = ex.Message;
}
理想情况下,重载只会告诉Elmah通过ErrorSignal.FromCurrentContext().Raise(e);
由于在项目中使用此技术的频率,我宁愿不在每次使用时添加该代码。为每个错误页面添加自定义错误页面而不是将错误添加到验证摘要中也超出了项目的范围。
答案 0 :(得分:1)
正如您所发现的,将所有内容包装在try / catch中通常并不是您真正想要的。您最终会“吞咽”您可能想要在某处登录的异常。如果您确实希望在页面上显示带有自定义验证程序的异常消息,则应该重新抛出异常,以便将其冒泡。 ASP.NET将允许您设置“全局”错误处理。如果您想吞下例外,可以在一个地方完成。如果您想用ELMAH发信号或使用其他方法记录它们,您可以在一个地方进行。这样可以防止异常处理DRY。
专业提示:使用
throw;
而不是throw ex;
。这将保持 原始堆栈跟踪。
答案 1 :(得分:0)
使用像log4net这样的日志记录库来记录这些异常(记录它们确实没有直接处理它们,但是你 使用异常处理 - 一旦你发现异常它被视为“已处理”)。
正如您所见,ELMAH用于未处理的异常。
这两种方法相互补充(ELMAH +日志库)。