论坛首页 Java企业应用论坛

为什么 Java 中要使用 Checked Exceptions

浏览 193216 次
该帖已经被评为精华帖
作者 正文
   发表时间:2005-02-28  
阿信 写道
robbin 写道
在使用UseCase来描述一个场景的时候,有一个主事件流和n个异常流。异常流可能发生在主事件流的过程,而try语句里面实现的是主事件流,而catch里面实现的是异常流,在这里Exception不代表程序出现了异常或者错误,Exception只是面向对象化的业务逻辑控制方法。如果没有明白这一点,那么我认为并没有真正明白应该怎么使用Java来正确的编程。

我比较认同robbin的说法,但有时亦要考虑到性能的问题,因为抛出Exception会比普通的JAVA语句消耗更多时间,有一次我们在WEBLOGIC控制台看到系统很频繁地做GC,并且每次GC回收内存很少。后来经查原来是代码中一个大循环中有多次Exception抛出,并用try{}catch(Exception e){}捕捉,造成性能下降。

可以反过来想:既然频繁出现这个情况,要么是确实有某种错误存在(例如数据完整性被破坏导致频频抛出异常),要么这就不是一个“异常”的情况,而是正常的程序逻辑流。异常应该用于描述“异常”的情况,不应该用来做流程控制。当程序正常运转时,异常——不管是checked还是unchecked,不管在catch段里的代码是多是少——应该是很少出现的。
0 请登录后投票
   发表时间:2005-02-28  
按Robbin的看法,是不是有一天我们应该写:

catch (UserLoginSuccessException ulse) {
}
0 请登录后投票
   发表时间:2005-02-28  
jianyu 写道
按Robbin的看法,是不是有一天我们应该写:

catch (UserLoginSuccessException ulse) {
}


如果你的业务就要求:不应该有人成功登陆进来。那么这样的代码是完全合理的。

譬如说,CSDN的后台管理系统只能在内网登陆。那么如果在外网登陆成功了,确实应该进这样一个异常。
0 请登录后投票
   发表时间:2005-02-28  
gigix, 谢谢你给这段代码加上了一个合理的场景:)那么当有人从内网成功登录是不是应该:

catch (InternalUserLoginSuccessException ulse) {
    // ...
    log.info("login success, you can use it now");
}
0 请登录后投票
   发表时间:2005-02-28  
这应该算是主事件流,怎么能算异常流呢?
0 请登录后投票
   发表时间:2005-02-28  
因为我想,按照前面讨论的论点,如果用面向对象的方法做设计,需要象这样:

catch (PasswordNotMatchException pnme); {
     return wrong_password.action
}
catch (...); {
}


那么,当成功登录的主事件流,不是也应该

catch (LoginSuccessException lse); {
     return login_success.action
}

0 请登录后投票
   发表时间:2005-02-28  
gigix 写道
可以反过来想:既然频繁出现这个情况,要么是确实有某种错误存在(例如数据完整性被破坏导致频频抛出异常),要么这就不是一个“异常”的情况,而是正常的程序逻辑流。异常应该用于描述“异常”的情况,不应该用来做流程控制。当程序正常运转时,异常——不管是checked还是unchecked,不管在catch段里的代码是多是少——应该是很少出现的。

确实是某种错误存在!我举这个例子只是想说Exception对性能有一定的影响,
亦不能滥用。对性能问题,我们的一般处理方法(特别是系统大的框架已经做
好的情况下):
1、先假设不是性能问题,而是系统参数、网络配置等问题,企业应用的性能
  问题大多是参数配置不当引起,特别是J2EE应用。然后用性能测试工具重现性
  能问题,如:LoadRunner。分析问题在那里,调整后再测试。
2、最后才考虑是不是代码的问题。
当然在系统刚开始设计时亦要考虑性能的问题,一些模块可能对系统的性能有
大的影响,如:批处理、大的查询、缓存的设计等。而在其它地方我感觉就没
必要为多new几个对象而发愁会不会影响性能。
0 请登录后投票
   发表时间:2005-03-01  
对中间件开发而言,checked exception的使用将会破坏信息封装的原则。
实际上,当软件的调用层次比较深时,一般不可能在最底层进行有意义的异常处理。一个功能模块必须集中处理异常。这要求异常将被接力抛出,直到到达合适的处理层次。如果调用层次中的每一个函数都明确知道checked exception但又不处理,就破坏了封装性原则
0 请登录后投票
   发表时间:2005-03-04  
Exception实际上代表了一个UseCase中的异常流的处理.
UseCase是用于捕获用户需求的.
如果我不用usecase呢?
异常没必要弄得那么复杂把?
异常的处理应用级上要根据需求,系统级上要根据程序的流程.
0 请登录后投票
   发表时间:2005-04-04  
Exception实际上代表了一个UseCase中的异常流的处理.
UseCase是用于捕获用户需求的.
quote]

个人人为 在设计业务层流程时 robbin讲因该没错 如果其他模块。。。可能就。。。。。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics