|
锁定老贴子 主题:嵌套异常处理逻辑的问题!
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2004-09-23
因为系统要严格处理每一种异常情况的发生,对于每一种异常必须保证交易的完整。 这样的话,比如说一个等待响应时异常发生(对方关闭连接),流程进入异常处理,登记数据库流水表,可是登记数据库又可能抛出HibernateException异常,对于这个异常,我又得处理!处理里面, 又可能有异常抛出,我........(晕倒了!) 结果一个逻辑下来,看看代码,大部分都是异常处理得代码啦! 怎么办? 需要一个事件处理吗?一样不能摆脱异常的抛出。 怎么办? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2004-09-23
标题招人烦,请楼主改过。楼主也不是新会员了,不该不懂规矩吧。
|
|
| 返回顶楼 | |
|
时间:2004-09-23
gigix,:( 想开一下玩笑,都被你打回来啦! 不玩了,说正经的。
仔细重新想了一下: 把异常归类: 1)正常出现的异常(连接中断) 2)不可挽回的异常(数据库down、配置文件突然被删掉导致的异常) 对于1)的处理应该属于业务处理的逻辑部分 2)的处理应该将整体流程导入一个比较合理的归途。 为了避免循环嵌套的异常,规定一些不可挽回的异常,以结束异常嵌套流程的处理。 |
|
| 返回顶楼 | |
|
时间:2004-09-23
firebody 写道 gigix,:( 想开一下玩笑,都被你打回来啦! 不玩了,说正经的。
仔细重新想了一下: 把异常归类: 1)正常出现的异常(连接中断) 2)不可挽回的异常(数据库down、配置文件突然被删掉导致的异常) 对于1)的处理应该属于业务处理的逻辑部分 2)的处理应该将整体流程导入一个比较合理的归途。 为了避免循环嵌套的异常,规定一些不可挽回的异常,以结束异常嵌套流程的处理。 大家有没有更好的办法,是不是我定义异常以及处理异常的逻辑错误了呢?checked Exception is a part of logic |
|
| 返回顶楼 | |
|
时间:2004-09-23
我的建议是把整个异常体系从RuntimeException继承下来,这样你可以在不影响接口的前提下加入更多的异常类型,client也可以随时选择自己能够处理的异常来处理。异常的分类还是必须的。
|
|
| 返回顶楼 | |
|
时间:2004-09-23
把整个逻辑写完整,包括乱七八糟的异常处理,
蓦然发现,java的Exception让我可爱的原本很整洁的代码变得好丑陋。 特别是异常处理逻辑里面还有可能抛出异常的情况,写下来简直一塌糊涂。 我都怀疑我的设计出了问题。可是,仔细想了想,我确实再没什么好的法子了。 |
|
| 返回顶楼 | |
|
时间:2004-09-23
firebody 写道 把整个逻辑写完整,包括乱七八糟的异常处理,
蓦然发现,java的Exception让我可爱的原本很整洁的代码变得好丑陋。 特别是异常处理逻辑里面还有可能抛出异常的情况,写下来简直一塌糊涂。 我都怀疑我的设计出了问题。可是,仔细想了想,我确实再没什么好的法子了。 把你的代码贴出来瞅瞅?这样空谈,不太好给你solution |
|
| 返回顶楼 | |
|
时间:2004-09-23
firebody 写道 比如说一个等待响应时异常发生(对方关闭连接),流程进入异常处理,登记数据库流水表,可是登记数据库又可能抛出HibernateException异常,对于这个异常,我又得处理!
我想在记录异常信息时没必要再处理异常了吧,通常对这个流水日志的准确性要求不是那么高的,可以直接忽略异常。至于操作完整性,应该靠事务来管理。 |
|
| 返回顶楼 | |
|
时间: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] |
|
| 返回顶楼 | |
|
时间: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] |
|
| 返回顶楼 | |






