论坛首页 Java版

嵌套异常处理逻辑的问题!

浏览 8174 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2004-09-23

因为系统要严格处理每一种异常情况的发生,对于每一种异常必须保证交易的完整。
这样的话,比如说一个等待响应时异常发生(对方关闭连接),流程进入异常处理,登记数据库流水表,可是登记数据库又可能抛出HibernateException异常,对于这个异常,我又得处理!处理里面, 又可能有异常抛出,我........(晕倒了!)
结果一个逻辑下来,看看代码,大部分都是异常处理得代码啦!
怎么办?
需要一个事件处理吗?一样不能摆脱异常的抛出。
怎么办?
   
时间:2004-09-23
标题招人烦,请楼主改过。楼主也不是新会员了,不该不懂规矩吧。
   
0 请登录后投票
时间:2004-09-23
gigix,:( 想开一下玩笑,都被你打回来啦! 不玩了,说正经的。
仔细重新想了一下:
把异常归类:
1)正常出现的异常(连接中断)
2)不可挽回的异常(数据库down、配置文件突然被删掉导致的异常)

对于1)的处理应该属于业务处理的逻辑部分
2)的处理应该将整体流程导入一个比较合理的归途。
为了避免循环嵌套的异常,规定一些不可挽回的异常,以结束异常嵌套流程的处理。
   
0 请登录后投票
时间:2004-09-23
firebody 写道
gigix,:( 想开一下玩笑,都被你打回来啦! 不玩了,说正经的。
仔细重新想了一下:
把异常归类:
1)正常出现的异常(连接中断)
2)不可挽回的异常(数据库down、配置文件突然被删掉导致的异常)

对于1)的处理应该属于业务处理的逻辑部分
2)的处理应该将整体流程导入一个比较合理的归途。
为了避免循环嵌套的异常,规定一些不可挽回的异常,以结束异常嵌套流程的处理。

大家有没有更好的办法,是不是我定义异常以及处理异常的逻辑错误了呢?checked Exception is a part of logic
   
0 请登录后投票
时间:2004-09-23
我的建议是把整个异常体系从RuntimeException继承下来,这样你可以在不影响接口的前提下加入更多的异常类型,client也可以随时选择自己能够处理的异常来处理。异常的分类还是必须的。
   
0 请登录后投票
时间:2004-09-23
把整个逻辑写完整,包括乱七八糟的异常处理,
蓦然发现,java的Exception让我可爱的原本很整洁的代码变得好丑陋。
特别是异常处理逻辑里面还有可能抛出异常的情况,写下来简直一塌糊涂。
我都怀疑我的设计出了问题。可是,仔细想了想,我确实再没什么好的法子了。
   
0 请登录后投票
时间:2004-09-23
firebody 写道
把整个逻辑写完整,包括乱七八糟的异常处理,
蓦然发现,java的Exception让我可爱的原本很整洁的代码变得好丑陋。
特别是异常处理逻辑里面还有可能抛出异常的情况,写下来简直一塌糊涂。
我都怀疑我的设计出了问题。可是,仔细想了想,我确实再没什么好的法子了。

把你的代码贴出来瞅瞅?这样空谈,不太好给你solution
   
0 请登录后投票
时间:2004-09-23
firebody 写道
比如说一个等待响应时异常发生(对方关闭连接),流程进入异常处理,登记数据库流水表,可是登记数据库又可能抛出HibernateException异常,对于这个异常,我又得处理!


我想在记录异常信息时没必要再处理异常了吧,通常对这个流水日志的准确性要求不是那么高的,可以直接忽略异常。至于操作完整性,应该靠事务来管理。
   
0 请登录后投票
时间:2004-09-23
Trustno1
老师好!学生收到。
下面是一部分代码:
[code:1]
TransactionConnection bankConn=container.getTransactionConnection(TransactionConnection.BANK,true);
try{
response=bankConn.writeMessage(request,true);
}catch(MessageWriteException e){
log.debug("Exception occur:"+ExceptionLogUtil.getTraces(e));
response=container.getMessage(container.getConfig().getConnectionConfig(TransactionConnection.LOCAL));
response.getMessageBean().setRet_code("03"); //设置错误代码
record.setStatus(Record.STAT_ERROR);//修改流水状态
record.setError_reason("向银行方发请求失败!");
try{
dao.updateRecord(record);
}catch(HibernateException err){
log.debug(ExceptionLogUtil.getTraces(err));
[color=red]//错误的产生是因为数据库的问题,既然数据库出了问题,再进行相应的补记操作仍然会抛出异常,所以应该直接返回,跳出嵌套处理的逻辑 [/color] }
return response;
}
[/code:1]
   
0 请登录后投票
时间:2004-09-23
catch到HibernateException err以后你要做什么样的处理?
还是和上面的错误处理一样么?如果是我建议这样
[code:1]
processErr(exception e,int times)
{
if(times>maxtimes)
throw exception("严重出错:..........");
log.debug("Exception occur:"+ExceptionLogUtil.getTraces(e));
response=container.getMessage(container.getConfig().getConnectionConfig(TransactionConnection.LOCAL));
response.getMessageBean().setRet_code("03"); //设置错误代码
record.setStatus(Record.STAT_ERROR);//修改流水状态
record.setError_reason("向银行方发请求失败!");
try{...
dao.updateRecord(record);
}catch(HibernateException err)
{
processErr(e,maxtimes++);
}
}
[/code:1]
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐