锁定老帖子 主题:老掉牙的话题,java的异常处理。
精华帖 (1) :: 良好帖 (6) :: 新手帖 (12) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-03-19
pufan 写道 carlkkx 写道 利用Checked Exception做业务流程分支设计比用返回值个人感觉更优雅
—————————————————————— 晕倒,这已经是完全滥用异常了,程序执行的正常结果也用异常来表征了,如果我是调用者碰到这样的API我应该是难受死还哪来的优雅。 不要一棒子打死,异常是否可以反映业务流分支这正应该不用争论了。很多情况下调用者的范围或者调用后程序的行为是可以预知和限定的,程序是死的,人是活的,不要太绝对。 这里我只能说你们很无奈,已经找不到正确结果好的表示方法了,只能选择异常了。 |
|
返回顶楼 | |
发表时间:2011-03-19
pufan 写道 carlkkx 写道 而且GUI程序,如果我点一下按钮,发现卡了半天,难道你这还不知道慢?而且不问青红皂白看到IOException就要构建后台线程,这本根就是增加复杂性,我们首先当然希望直接在EDT里面就能搞定,只有确实慢了我们才考虑后台线程。
如果你通过点按钮测试EDT问题的话,那看来你确实没开发过大型桌面程序。 本地测试环境和正式运行环境(很可能是公网)的网速完全不一样,往往本地不卡的程序上线就卡死。 如果和网络有通信的自然是会在后台线程,而且我给上层的通信API就有异步的,或者说使用异步本根就是常态。而且你不要用大型来掩盖你一个方法封装到最后居然连是否发生网络通信都已经搞不清了的问题。这说明你们的设计有问题,完全的过度封装,是不是要走本地调用和远程调用一回事的路线?结果封成这样还是不是一回事,你们浪费了封装人的苦心,因为你们还是通过IOException来分辨差别。 |
|
返回顶楼 | |
发表时间:2011-03-19
carlkkx 写道 pufan 写道 carlkkx 写道 利用Checked Exception做业务流程分支设计比用返回值个人感觉更优雅
—————————————————————— 晕倒,这已经是完全滥用异常了,程序执行的正常结果也用异常来表征了,如果我是调用者碰到这样的API我应该是难受死还哪来的优雅。 不要一棒子打死,异常是否可以反映业务流分支这正应该不用争论了。很多情况下调用者的范围或者调用后程序的行为是可以预知和限定的,程序是死的,人是活的,不要太绝对。 这里我只能说你们很无奈,已经找不到正确结果好的表示方法了,只能选择异常了。 何为好何为坏,能有效帮助调用者而不忽略所有可能的条件我看就是好,尽管异常对于大部分人看总像个“黑猫”。 |
|
返回顶楼 | |
发表时间:2011-03-19
走本地调用和远程调用一回事的路线的人本根不知道时间也是接口的一部分。
|
|
返回顶楼 | |
发表时间:2011-03-19
pufan 写道 carlkkx 写道 pufan 写道 carlkkx 写道 利用Checked Exception做业务流程分支设计比用返回值个人感觉更优雅
—————————————————————— 晕倒,这已经是完全滥用异常了,程序执行的正常结果也用异常来表征了,如果我是调用者碰到这样的API我应该是难受死还哪来的优雅。 不要一棒子打死,异常是否可以反映业务流分支这正应该不用争论了。很多情况下调用者的范围或者调用后程序的行为是可以预知和限定的,程序是死的,人是活的,不要太绝对。 这里我只能说你们很无奈,已经找不到正确结果好的表示方法了,只能选择异常了。 何为好何为坏,能有效帮助调用者而不忽略所有可能的条件我看就是好,尽管异常对于大部分人看总像个“黑猫”。 我要是你的调用者我就很讨厌这样的设计,并认为你没帮助我什么反而增加了我很多麻烦,当然你可以说:咱们道不同不相为谋。 |
|
返回顶楼 | |
发表时间:2011-03-19
carlkkx 写道 pufan 写道 carlkkx 写道 而且GUI程序,如果我点一下按钮,发现卡了半天,难道你这还不知道慢?而且不问青红皂白看到IOException就要构建后台线程,这本根就是增加复杂性,我们首先当然希望直接在EDT里面就能搞定,只有确实慢了我们才考虑后台线程。
如果你通过点按钮测试EDT问题的话,那看来你确实没开发过大型桌面程序。 本地测试环境和正式运行环境(很可能是公网)的网速完全不一样,往往本地不卡的程序上线就卡死。 如果和网络有通信的自然是会在后台线程,而且我给上层的通信API就有异步的,或者说使用异步本根就是常态。而且你不要用大型来掩盖你一个方法封装到最后居然连是否发生网络通信都已经搞不清了的问题。这说明你们的设计有问题,完全的过度封装,是不是要走本地调用和远程调用一回事的路线?结果封成这样还是不是一回事,你们浪费了封装人的苦心,因为你们还是通过IOException来分辨差别。 异步部分(或者大部分,我认为)情况下都不是常态,因为很可能需要堵塞在耗时操作线程后做其他耗时操作,作为api的设计者你不能假设所有调用方法情况都是异步,让调用者根据自己情况处理才是好的设计。 现实情况是:确实存在搞不清楚的状况,而且很频繁,这不是设计的问题,也不是过度封装,是Swing/Awt根本没有一个机制保障EDT安全,当然IO checked exception可以完美的解决这个问题。 |
|
返回顶楼 | |
发表时间:2011-03-19
carlkkx 写道 走本地调用和远程调用一回事的路线的人本根不知道时间也是接口的一部分。
如何把时间放在接口内,传递Date? |
|
返回顶楼 | |
发表时间:2011-03-19
我首先纠正你这世上没有几个GUI框架不是这样的,不仅仅是Swing,SWT ,WinForm如果你在事件分派线程中执行长时间任务都会卡住分派线程。
|
|
返回顶楼 | |
发表时间:2011-03-19
carlkkx 写道 pufan 写道 carlkkx 写道 pufan 写道 carlkkx 写道 利用Checked Exception做业务流程分支设计比用返回值个人感觉更优雅
—————————————————————— 晕倒,这已经是完全滥用异常了,程序执行的正常结果也用异常来表征了,如果我是调用者碰到这样的API我应该是难受死还哪来的优雅。 不要一棒子打死,异常是否可以反映业务流分支这正应该不用争论了。很多情况下调用者的范围或者调用后程序的行为是可以预知和限定的,程序是死的,人是活的,不要太绝对。 这里我只能说你们很无奈,已经找不到正确结果好的表示方法了,只能选择异常了。 何为好何为坏,能有效帮助调用者而不忽略所有可能的条件我看就是好,尽管异常对于大部分人看总像个“黑猫”。 我要是你的调用者我就很讨厌这样的设计,并认为你没帮助我什么反而增加了我很多麻烦,当然你可以说:咱们道不同不相为谋。 你可以讨厌这个设计,也可以忽略掉部分结果从而导致更大的错误,API设计者要求你处理你就要处理,比方说OSCache里getFromCache方法就会抛出NeedsRefreshException checked exception,强制你处理。 |
|
返回顶楼 | |
发表时间:2011-03-19
最后修改:2011-03-19
另外我的客户端如果要和server通信那是明确的,你要获得某个server的连接,但是这通常是被配置的,我们先不管这个,假设你获得了server的连接,那么你要和server通信怎么办呢?
连接上提供了足够的通信机制,我们看一下例子: connection.requestRemoteService("服务名", para, new CommonMsgCallback() { public void onMessage(CommonMsg msg) { } connection.requestRemoteService("服务名", para, new CommonMsgSwingCallback() { public void onSwingMessage(CommonMsg msg) { } CommonMsg msg = connection.syncRequestRemoteService("服务名",para); 我想问一下你,在我举得例子里面,你会不知道你在和server通信吗?上面举得三个通信方法都是请求响应模式,其实还有一些变种可以指定这次通信的超时等。第一第二个都是异步的,第二个的好处是如果消息的回应处理需要设置到GUI,那么onSwingMessage已经是EDT线程安全的。 第三个就是同步请求响应。 当然connection还有注册监听模式的通信方式。在我目前构建的Swing客户端世界里,我是难以想象一个人最后要通过异常来判断是不是一个耗时的操作。 |
|
返回顶楼 | |