设想你是用户, 你憎恨什么样的异常处理方式

2012-09-26  李斐然 

"异常处理"是一个非常简单的概念, 但"困难"在最佳实践. 反正我做软件好多年了, 也没有完全掌握, 常常还会陷入迷茫之中.

今天, 我把自己 设想为一个软件用户, 然后再考虑我"憎恨什么样的异常处理方式".、

出错了当没有出错。。。?
通常来说, 你第一个会想到“出错了当没有出错, 继续执行下去”这种情况。 确实这是异常处理的大忌。 但是对于java开发的程序, 这种情况反而是很少出现的。 因为既然“已经检查到了异常”, 处理起来还不简单吗?最简单, 抛出来就可以了嘛。 所以下面的代码是很少很少出现的
<code>
try {...} catch (Exception e) {/*do nothing*/}
</code>

经常遇到的, 应该是该捕获/检查的异常情况, 却没有处理。
1. 应该捕获的系统错误, 却没有去检查
这里的系统错误指外部系统错误。 比如一个程序需要些一个临时文件,在启动时会初始化这个文件。 但是因为其默认的文件所在磁盘已满, 而且这个异常没有检查到, 导致程序直接退出。 那么我会相当恼火。

2. 应该检查的用户输入, 却没有去检查
用户永远不愿意去读manual,而宁愿去按照自己的经验尝试使用软件。  比如用户名字不能有下划线"_", 但是没有检查, 导致新建用户不能登录系统。 那么我会相当有“怨念”

3. 应该检查的某个操作的前置条件, 却没有去检查
比如创建了重名的条目。

 如果有了足够的对“系统/用户输入/前置条件”的检查, 那么异常处理就完成了99%的工作。 至于怎么处理这个异常, 是不怎么重要的。 

通常来说, 简单的把异常显示给用户, 然后终止程序或者transaction就可以了。 用户是具有灵活性的, 他会根据错误信息去寻找相应的解决方案。 

异常处理方法也很重要的情况
只有一种情况, 我能想到的, 异常处理方法也很重要, 那就是对用户提交的表单的检查中的异常。 如果一个100个域 的表单, 在提交后 ,用户不能在之前的表单数据上做纠正, 而需要重新把所有数据输入一遍, 我想用户一定会疯掉的。
因为我只能想到这样一种情况, 所以它就是剩下的1%吧。

那么异常层次呢?
在java里异常可以有一个继承层次结构。   那么是否有必要”设计异常的层次“呢? 嗯。。。这个看起来很酷, 也比较有吸引力, 而且我以前也是这样做的, 但是现在我发现其实没啥必要。
为异常设计继承层次的目的是为了更好的处理异常。比如你可以在最外层包一个try catch
<code>
try {
...
}
catch (ABCException e1) {/* do something */}
catch (XYZException e2) {/* do something */}
...
</code>
但是如上所说,  绝大部分情况, 用户能看到你给出的异常情况信息就足够了。  所以, 我觉得基本上只要有SysException, AppException, InputException三个类型就可以了。

313°/3136 人阅读/0 条评论 发表评论

登录 后发表评论