日期:2014-05-18  浏览次数:20783 次

J2ee实际项目中的异常处理问题
最近在做项目时,被老大喷的狗血淋头。主要是代码的健壮性问题。由于是游戏公司,所以对代码的质量要求非常高,对数据的处理,连断电的情况都要考虑到。

被喷的主要一块就是对异常的处理。所以想向大家请教下,大家在实际工作中对于异常处理的一些经验?如何建立一个项目中的异常体系?希望能分享分享!实在是万分感谢。

比如,我举几个典型的例子。

在我们的项目中,如果我们有文件需要写到本地,那肯定要有一个FileOutputStream。当我们构造这个FileOutputStream时,FileOutputStream可能会抛出一个受检异常,FileNotFoundException.请问,这时候,我们该如何去处理?这个FileNotFoundException,大家可以去看看API,并不是说文件找不到。而是说,文件不存在,但是无法创建!或者无法打开!

上面这种情况,当程序中出现了,我们应该让我们的程序如何处理呢?记录一条日志?还是继续包装一个RuntimeException抛出?很有可能,我们的系统中有一条专门的线程负责写文件,这时候碰到这个异常。那线程已经无法执行下去了,这线程无法执行下去,系统还有必要执行下去么?

其实我想问的是,当我们碰到,程序无法靠代码自身解决的异常,我们该如何处理?

如何看完了,则非常感谢!希望大家踊跃讨论!这个实际开发中最经常碰到的问题了。我觉得。
小伙伴们快来啊!
------解决方案--------------------
对于游戏,肯定是高并发的,如果一个线程出现了异常,不可能让系统也停掉吧?就像其中一个游戏玩家出问题了,系统如果挂了,那其他玩家怎么办???所以一个线程出问题了,系统不可能停的。。。
------解决方案--------------------
try catch ,当然也可以自己定义一些异常。游戏没设计没接触。
web的话可以弄一个过滤器拦截所有异常统一抛到友好界面。
------解决方案--------------------
异常处理,要有备份和回复数据的能力。
------解决方案--------------------
引用:
Quote: 引用:

异常处理,要有备份和回复数据的能力。

求版主说的稍稍详细点。保证数据一致性,这个大的概念我有。或者,有木有什么好的相关的书推荐下?或者是相关的文章什么的?感谢了~

比如异常出现了,首先确保别人输入的数据(未保存到数据库的)备份下来。异常恢复后及时插入数据库。
书籍没有。
------解决方案--------------------
无法考代码自身解决的异常那就友好地显示出来吧,比如物理环境导致的异常,我们没有办法控制的。
------解决方案--------------------
做好备份是第一位的,自定义异常 对特殊状况 没多大用处吧
------解决方案--------------------
引用:
Quote: 引用:

做好备份是第一位的,自定义异常 对特殊状况 没多大用处吧
求举一些实际例子,稍微详细点讲讲备份的技巧。合适备份,何时在异常中利用备份。感谢~

简单点的临时备份,
在程序启动时,先检查是否有未处理备份文件,采用关键字对不同命令或数据执行相应操作---恢复过程
程序正常执行时,针对不同操作在本地同步生成临时备份文件(相当于日志),---工作过程
如果程序正常关闭,则保存数据后删除本次生成的备份文件,---正常结束
如果中途断电或其他非程序错误,则本地的备份文件不会消失,下次启动再检查,---异常处理
------解决方案--------------------
从用户干预的角度出发,把异常分成两种:用户可干预、用户干预无效,这两种异常大类。

对于用户可干预异常,通过友好的提醒,让用户通过特定的步骤或者修改操作内容、步骤的方式使操作继续。

对于用户干预无效的异常,则系统记录出错的位置、当时的状态信息,以有效的方式反馈;然后只能对用户抱歉退出了。

在系统框架中可以自行封装这两种大的异常种类,各异常出现时封装为这两种大类后抛出。
------解决方案--------------------
我觉得看你的代码是做什么用的。
如果做的是基础功能,或者通用库,会在不同模块中调用。那么总的原则是抛,你可以直接抛,包装一下抛,包成RuntimeException抛。反正你不知道实际的情况,只能抛,让具体功能去根据自己的情况处理。
要是直接的功能,那就根据功能来看。能记录日志就记录,可以重做就重做,有默认值就用默认值......实在不行,就封成RuntimeException抛。
在最上层,一定要catch一下Throwable,做最后的善终。当然,这个我也经常忘。