关于Asp.Net异常处理的问题

zhongkeruanjian 2008-02-28 10:11:41
比如我在业务逻辑层某一个方法有一个BusinessException异常抛出,表示有业务逻辑错误(比如批准订单时,如果客户的信用额少于订单总额,此异常的Message为:信用额太少,无法批准订单的信息)
在Web层当按钮点击后调用此方法,我希望如果有此异常抛出时,用对话框的形式告诉用户。目前可以通过加Try,Catch可以做到,
但是我不想每次调用业务逻辑层的方法时都要加上这几句话,
故在Page.OnError()中捕获此异常,并输出对话框的JS,但是问题就来了:Asp.net的Page在遇到未处理异常,在OnError会中止此页面的Render,(哪怕是用server.ClearError都不行)。其效果是客户端看到的页面是一个空白页面。

故有什么办法可以让页面照样显示,对话框也能出来,并且是通用处理,而不是每次都要加上Try Catch

(请不要告诉我不用异常来传递业务逻辑错误,已经是既成事实,无法改变)。
...全文
1129 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongkeruanjian 2008-03-05
  • 打赏
  • 举报
回复
没关系,可能MS对WebForm和Winform的异常设计策略不一样,根本就没有让我们自己解决未处理的异常后,页面继续执行的道理,毕竟Winform是运行在单客户端上的,就算未处理异常再多,也不是单机程序崩溃,而WebForm毕竟只有一台服务器,如果未处理异常太多导致程序崩溃,这种损失比单机程序大吧,所以干脆停止执行请求页面,引起注意把。

再等2天,可能真的没有好的解决方法了,只能调用的时候加Try Catch了
fcxxfcxx 2008-03-04
  • 打赏
  • 举报
回复
学习
jimu8130 2008-03-04
  • 打赏
  • 举报
回复
我和luck的想法是一样的,不过并不是在业务逻辑层每隔方法都这样来封装,而是再对业务逻辑层进行一次封装。

参数传递这个和你的一样,当初仅仅是有这样一个思路,并没有实践过,如果有误导你的,请原谅
zhongkeruanjian 2008-03-04
  • 打赏
  • 举报
回复
luck0235

这个方法肯定不行了,第一:业务逻辑层是Winform和WebForm公用的,第二:每个方法都加这么个参数,工作量太大,而且别扭

jimu8130

不知道仁兄如何把参数传进去“

我只能想到:

BussinessHelper.Methord(string typeName,//全限定类名
string methodName,//方法名
object[] objects //方法参数)

然后在Methord里通过反射调用。
jimu8130 2008-02-29
  • 打赏
  • 举报
回复
try
{
//业务方法是可变的。
反射来实现(如果在一个程序集最好)
}
catch(BusinessException ex)
{
//注入JS。 类似下面的来注入
string key = "Warning";
string script = "window.alert('some warning !');";
ClientScriptManager csm = page.ClientScript;
if (!csm.IsStartupScriptRegistered(key))
{
csm.RegisterStartupScript(page.GetType(), key, script, true);
}

}
tang5399 2008-02-28
  • 打赏
  • 举报
回复
"比如批准订单时,如果客户的信用额少于订单总额,此异常的Message为:信用额太少,无法批准订单的信息 "
这种信息不应该由异常来处理,这些是可以预期的,应该是在代码里处理的

"我在想是不是Web.config里是不是有什么配置之类的,可以继续Render。"
据我所知是没有的,
或许可以在页面置个标记或session一类初值为0,捕获异常后置1再回调此页面,页面载入时判断这个值
zhongkeruanjian 2008-02-28
  • 打赏
  • 举报
回复
我用Page.Error,不管是Override还是注册事件,Asp.net都会停止Render,出个空白页面。。。

NqIceCoffee

因为有业务逻辑层封装比较彻底,界面层有WinForm和WebForm,没有用返回标识符(或者消息字符串)的形式,这样太过烦琐。

winForm里是没有问题,在线程异常里统一处理,弹出窗口,挺好的,结果在Web这边Asp.net会停止Render

我在想是不是Web.config里是不是有什么配置之类的,可以继续Render。

转到错误页面肯定是不行了。这样会被用户骂死。
真相重于对错 2008-02-28
  • 打赏
  • 举报
回复
page.Error 事件处理
NqIceCoffee 2008-02-28
  • 打赏
  • 举报
回复
SORRY

遇见==》预见
NqIceCoffee 2008-02-28
  • 打赏
  • 举报
回复
比如批准订单时,如果客户的信用额少于订单总额,此异常的Message为:信用额太少,无法批准订单的信息

====================


这些都是可遇见的逻辑问题,用的着抛异常吗?
tang5399 2008-02-28
  • 打赏
  • 举报
回复
有异常页面照样显示不知何意,要给客户看到一个出错的页面么?
显示JS容易,
Server.ClearError();后Server.Transfer到一个通用页面弹出提示错误
活靶子哥哥 2008-02-28
  • 打赏
  • 举报
回复
golbal.asax

protected void Application_Error(Object sender, EventArgs e) {
if (Server.GetLastError() is BusinessException)
//do..
xh831213 2008-02-28
  • 打赏
  • 举报
回复
1 业务逻辑层返回一个dataset,正常情况压入正确的信息
2 出现业务异常以后,向ds中压入一个名称为ErrorTable的表,里面存放错误信息
3 在页面中判断返回的ds中是否包含ErrorTable表,包含则处理业务错误
gouyear 2008-02-28
  • 打赏
  • 举报
回复
学习中
luck0235 2008-02-28
  • 打赏
  • 举报
回复
在业务层加一个Page参数吧,如下:

//业务层方法
public static void test(System.Web.UI.Page page, string a)
{
try
{
int b = int.Parse(a);
}
catch
{
string key = "Warning";
string script = "window.alert('some warning !');";
ClientScriptManager csm = page.ClientScript;
if (!csm.IsStartupScriptRegistered(key))
{
csm.RegisterStartupScript(page.GetType(), key, script, true);
}
}
}


//UI调用
test(this.Page, "a");
zhongkeruanjian 2008-02-28
  • 打赏
  • 举报
回复
Server.ClearError()都不行?
cat_hsfz 2008-02-28
  • 打赏
  • 举报
回复
OnError没有catch的作用,Exception必然继续冒泡,导致HttpRuntime发现这个Exception。
zhongkeruanjian 2008-02-28
  • 打赏
  • 举报
回复
上楼谢了,能否给个这个公用方法的例子?
try
{
//业务方法是可变的。
}
catch(BusinessException ex)
{
//注入JS。
}

把业务方法作为参数传进去?
jimu8130 2008-02-28
  • 打赏
  • 举报
回复
稍微换个思路,你不想老是trycatch,那么
你把你原来try catch给抽象成为个公用方法,并传入相应的页面引用(借此可向里面注入js以弹出对话框)
LutzMark 2008-02-28
  • 打赏
  • 举报
回复
似乎没有办法

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧