1)我有继承自Page Class的PageBase类。后面的所有代码都继承自PageBase类。所以我想将异常处理逻辑添加到PageBase类。
在Page_Error事件中,我添加了处理异常的逻辑,但是我希望页面能够正确呈现,并在网页顶部显示异常详细信息。
e.g
在网络表单上,我有按钮控件来更新数据库中的数据。单击按钮,我有更新数据的逻辑。更新它可能会引发异常。我不想在按钮单击保存逻辑上放置Try catch块。相反,我希望PageBase上的一些方法或事件能够捕获异常并完全呈现页面中的所有控件和异常。
2)`//在CodeBehind页面的Base类中,我写了
protected void TryAction(Action action)
{
try
{
action();
}
catch(Exception e)
{
// write exception to output (Response.Write(str))
}
}
在CodeBehind中,我编写了Button Click Event的代码
Private List<T> GetData(string a, string b)
{
List<T> _lst;
TryAction(()=>{
//Call BLL Method to retrieve the list of BO.
_lst = BLLInstance.GetAllList(a,b);
});
return _lst;
}
这很好,我想,
Private List<T> GetData(string a, string b)
{
TryAction(()=>{
//Call BLL Method to retrieve the list of BO.
return BLLInstance.GetAllList(a,b);
});
}
显示错误“System.Action retuens void”,如果我们有返回类型,请告诉我如何使用TryAction方法。
答案 0 :(得分:1)
当抛出异常时,如果你没有捕获它,它将冒泡到Page_Error然后是Application_Error。一旦它到达Page_Error,它已经破坏了页面呈现。我认为没有办法继续渲染页面的其余部分。如果您希望增加代码重用错误处理逻辑,可以使用匿名方法。
// on your base page
protected void TryAction(Action action)
{
try
{
action();
}
catch(Exception e)
{
// write exception to output (Response.Write(str))
}
}
protected void TryFunction<T>(Function<T> func)
{
try
{
return func();
}
catch(Exception e)
{
// write exception to output (Response.Write(str))
return default(T);// have to return something now because it's a function.
}
}
然后您的数据访问方法可能看起来像
protected void Button1_Click(object sender, EventArgs e)
{
TryAction(() => {
// Do stuff here - save to database etc
});
}
protected void Button1_Click(object sender, EventArgs e)
{
return TryFunction<string>(() => {
// Do stuff here - save to database etc
return "woo";
});
}
值得注意的是,如果函数中发生异常,您可能无法从中获取有用的值,您应该相应地进行编码。
答案 1 :(得分:1)
不要抓住异常并继续。这几乎不是正确的想法,并且从不向用户显示异常信息。这些错误的技术性质会使它们烦恼,并导致信息泄露,这是一个安全问题。
相反,配置应用程序以显示自定义错误消息RemoteOnly
并使用日志记录框架记录抛出的异常。 ELMAH是一个很好的框架。从NuGet获取它。