c***5 发帖数: 158 | 1 Java一般什么情况下要throw exception呢,有设计原则吗? |
p*****2 发帖数: 21240 | 2 java 的 exception 是一个bad design
【在 c***5 的大作中提到】![](/moin_static193/solenoid/img/up.png) : Java一般什么情况下要throw exception呢,有设计原则吗?
|
m******e 发帖数: 201 | 3 没有exception怎么fail early, 一堆if else?
Exception在大型系统里帮助快速找到问题
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : java 的 exception 是一个bad design
|
l*******b 发帖数: 2586 | 4 都是这样的?哈哈哈
catch ( Exception e)
{ print(e.stacktrace()); }
【在 m******e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 没有exception怎么fail early, 一堆if else? : Exception在大型系统里帮助快速找到问题
|
p*****2 发帖数: 21240 | 5
zhaoce不是说了吗?AOP可以搞定,Monad也可以搞定。
【在 m******e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 没有exception怎么fail early, 一堆if else? : Exception在大型系统里帮助快速找到问题
|
z****e 发帖数: 54598 | 6 我觉得exception更无脑一点
如果不用exception,那就需要把所有情况都考虑到才行
用aop其实只是简化了代码的书写
不会出现try catch 灾难,但是本质上是一样的
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : zhaoce不是说了吗?AOP可以搞定,Monad也可以搞定。
|
o***g 发帖数: 2784 | 7 个人理解
异常都是在整个任务没法干的情况下才抛
比如登陆,数据库连不上了,得抛异常,是登陆这事儿没法干。如果用户名密码不匹配
,不能抛异常,该返回false就返回false。
还有哪一层抓异常也有讲究
还有的时候需要用assert
【在 c***5 的大作中提到】![](/moin_static193/solenoid/img/up.png) : Java一般什么情况下要throw exception呢,有设计原则吗?
|
d*******r 发帖数: 3299 | 8 一直没搞懂 Exception 的必要性,虽然以前写 C++ 时候也用.
如果真这么必要,那 C 或者 Go 岂不是很难用? Go 还专门就不设计 Exception 呢. |
n*w 发帖数: 3393 | 9 上次在一个f#会上speaker推荐用monad代替AOP。 说AOP带来的诸多问题。
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : zhaoce不是说了吗?AOP可以搞定,Monad也可以搞定。
|
p***o 发帖数: 1252 | 10 Go没用过,你要写个C函数管理几个资源,保证每个错误都处理到以及函数返回之前把
东西清干净就不是件容易的事,更别提让你过段时间或者让别人来维护这段代码了。
【在 d*******r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 一直没搞懂 Exception 的必要性,虽然以前写 C++ 时候也用. : 如果真这么必要,那 C 或者 Go 岂不是很难用? Go 还专门就不设计 Exception 呢.
|
|
|
d*******r 发帖数: 3299 | 11 问个问题,为什么语言不设计成让每一个 function 都能有一个返回值: unexpected_
return_value, 然后所有函数的 caller 都必须强制 check和处理这个值呢? 这样算是
算用 return value 实现了 exception?
我的意思是说,编程语言本身,在未知错误下,能确保 function 返回这个
unexpected_return_value.
当然,很久前学 C++ exception 时候,记得说 exception 还有个所谓好处: 把处理错
误的代码和正常逻辑的代码分开.
【在 p***o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : Go没用过,你要写个C函数管理几个资源,保证每个错误都处理到以及函数返回之前把 : 东西清干净就不是件容易的事,更别提让你过段时间或者让别人来维护这段代码了。
|
p***o 发帖数: 1252 | 12 你这不是都知道么 ...
用exception把处理错误代码和正常流程分开。exception确实是强制处理的,只不过
不一定要在caller处理,你不处理程序直接退出。抛exception的地方和处理exception
地方之间靠finally或者stack unwinding清理资源。当然很多时候finally也不方便,
你看C#和Java或早或迟也加入了类似stack unwinding的try with。
【在 d*******r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 问个问题,为什么语言不设计成让每一个 function 都能有一个返回值: unexpected_ : return_value, 然后所有函数的 caller 都必须强制 check和处理这个值呢? 这样算是 : 算用 return value 实现了 exception? : 我的意思是说,编程语言本身,在未知错误下,能确保 function 返回这个 : unexpected_return_value. : 当然,很久前学 C++ exception 时候,记得说 exception 还有个所谓好处: 把处理错 : 误的代码和正常逻辑的代码分开.
|
l**********n 发帖数: 8443 | 13 goto
【在 c***5 的大作中提到】![](/moin_static193/solenoid/img/up.png) : Java一般什么情况下要throw exception呢,有设计原则吗?
|
b***i 发帖数: 3043 | 14 看这么多人讨论热火朝天,不如给你举个例子吧
一个BASIC解释程序,有个语句Statement的基类,然后各个语句实现了子类。子类必须
实现两个函数,doParse和execute,非别对应编译和执行过程。那么,doParse应该
throws SyntaxError,而execute应该throws RuntimeError。简单的做,就是在new
SyntaxError(...)的时候, 把行号和为什么错了放在构造函数里面,抛出异常。那么哪
里catch呢?程序应该有一个线程里面执行每一行程序,这个函数是所有子类execute()
的caller
..... throws RuntimeError {
try{
statement = statement.nextStatement();
statement.execute();
} catch(RuntimeError ex){
...此处并不printstack,也不强制退出,而是显示哪一行错了,为什么错了,然后
线程结束,程序回到编辑状态,用户可以修改,再次执行这个线程
}
}
总结,为什么抛异常?为了在caller或者更高层的caller那里统一处理异常,而不是每
个函数里面直接处理。这样,你改变处理的过程,在一个地方改就行了,而不是每个地
方都改。更一般的说,无法在函数里面进行处理,而是在caller那里处理在逻辑上更直
观,简单。比如函数里面不知道这种情况该怎么办,让呼叫着来处理。
Exception不是错误,而是函数知道自己无法处理而进行退出的办法,是控制程序流程
的办法。
【在 c***5 的大作中提到】![](/moin_static193/solenoid/img/up.png) : Java一般什么情况下要throw exception呢,有设计原则吗?
|
l******t 发帖数: 55733 | 15
这就是FP干的事啊
【在 d*******r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 问个问题,为什么语言不设计成让每一个 function 都能有一个返回值: unexpected_ : return_value, 然后所有函数的 caller 都必须强制 check和处理这个值呢? 这样算是 : 算用 return value 实现了 exception? : 我的意思是说,编程语言本身,在未知错误下,能确保 function 返回这个 : unexpected_return_value. : 当然,很久前学 C++ exception 时候,记得说 exception 还有个所谓好处: 把处理错 : 误的代码和正常逻辑的代码分开.
|
z****e 发帖数: 54598 | 16 fp出现的时间点远比oop要早
fp要能把所有问题都搞定,就不会有oop的今天
aop只是作为oop的补充,提倡用monad替代aop的多半是fp的狂热份子
【在 n*w 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 上次在一个f#会上speaker推荐用monad代替AOP。 说AOP带来的诸多问题。
|
z****e 发帖数: 54598 | 17 你说的不就是throws exception么?
你要是不想看到try catch灾难的话
直接把所有的方法的exception全部往上抛
一直抛到顶层来处理就是了
【在 d*******r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 问个问题,为什么语言不设计成让每一个 function 都能有一个返回值: unexpected_ : return_value, 然后所有函数的 caller 都必须强制 check和处理这个值呢? 这样算是 : 算用 return value 实现了 exception? : 我的意思是说,编程语言本身,在未知错误下,能确保 function 返回这个 : unexpected_return_value. : 当然,很久前学 C++ exception 时候,记得说 exception 还有个所谓好处: 把处理错 : 误的代码和正常逻辑的代码分开.
|
c***5 发帖数: 158 | 18 Java一般什么情况下要throw exception呢,有设计原则吗? |
p*****2 发帖数: 21240 | 19 java 的 exception 是一个bad design
【在 c***5 的大作中提到】![](/moin_static193/solenoid/img/up.png) : Java一般什么情况下要throw exception呢,有设计原则吗?
|
m******e 发帖数: 201 | 20 没有exception怎么fail early, 一堆if else?
Exception在大型系统里帮助快速找到问题
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : java 的 exception 是一个bad design
|
|
|
l*******b 发帖数: 2586 | 21 都是这样的?哈哈哈
catch ( Exception e)
{ print(e.stacktrace()); }
【在 m******e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 没有exception怎么fail early, 一堆if else? : Exception在大型系统里帮助快速找到问题
|
p*****2 发帖数: 21240 | 22
zhaoce不是说了吗?AOP可以搞定,Monad也可以搞定。
【在 m******e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 没有exception怎么fail early, 一堆if else? : Exception在大型系统里帮助快速找到问题
|
z****e 发帖数: 54598 | 23 我觉得exception更无脑一点
如果不用exception,那就需要把所有情况都考虑到才行
用aop其实只是简化了代码的书写
不会出现try catch 灾难,但是本质上是一样的
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : zhaoce不是说了吗?AOP可以搞定,Monad也可以搞定。
|
o***g 发帖数: 2784 | 24 个人理解
异常都是在整个任务没法干的情况下才抛
比如登陆,数据库连不上了,得抛异常,是登陆这事儿没法干。如果用户名密码不匹配
,不能抛异常,该返回false就返回false。
还有哪一层抓异常也有讲究
还有的时候需要用assert
【在 c***5 的大作中提到】![](/moin_static193/solenoid/img/up.png) : Java一般什么情况下要throw exception呢,有设计原则吗?
|
d*******r 发帖数: 3299 | 25 一直没搞懂 Exception 的必要性,虽然以前写 C++ 时候也用.
如果真这么必要,那 C 或者 Go 岂不是很难用? Go 还专门就不设计 Exception 呢. |
n*w 发帖数: 3393 | 26 上次在一个f#会上speaker推荐用monad代替AOP。 说AOP带来的诸多问题。
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : zhaoce不是说了吗?AOP可以搞定,Monad也可以搞定。
|
p***o 发帖数: 1252 | 27 Go没用过,你要写个C函数管理几个资源,保证每个错误都处理到以及函数返回之前把
东西清干净就不是件容易的事,更别提让你过段时间或者让别人来维护这段代码了。
【在 d*******r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 一直没搞懂 Exception 的必要性,虽然以前写 C++ 时候也用. : 如果真这么必要,那 C 或者 Go 岂不是很难用? Go 还专门就不设计 Exception 呢.
|
d*******r 发帖数: 3299 | 28 问个问题,为什么语言不设计成让每一个 function 都能有一个返回值: unexpected_
return_value, 然后所有函数的 caller 都必须强制 check和处理这个值呢? 这样算是
算用 return value 实现了 exception?
我的意思是说,编程语言本身,在未知错误下,能确保 function 返回这个
unexpected_return_value.
当然,很久前学 C++ exception 时候,记得说 exception 还有个所谓好处: 把处理错
误的代码和正常逻辑的代码分开.
【在 p***o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : Go没用过,你要写个C函数管理几个资源,保证每个错误都处理到以及函数返回之前把 : 东西清干净就不是件容易的事,更别提让你过段时间或者让别人来维护这段代码了。
|
p***o 发帖数: 1252 | 29 你这不是都知道么 ...
用exception把处理错误代码和正常流程分开。exception确实是强制处理的,只不过
不一定要在caller处理,你不处理程序直接退出。抛exception的地方和处理exception
地方之间靠finally或者stack unwinding清理资源。当然很多时候finally也不方便,
你看C#和Java或早或迟也加入了类似stack unwinding的try with。
【在 d*******r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 问个问题,为什么语言不设计成让每一个 function 都能有一个返回值: unexpected_ : return_value, 然后所有函数的 caller 都必须强制 check和处理这个值呢? 这样算是 : 算用 return value 实现了 exception? : 我的意思是说,编程语言本身,在未知错误下,能确保 function 返回这个 : unexpected_return_value. : 当然,很久前学 C++ exception 时候,记得说 exception 还有个所谓好处: 把处理错 : 误的代码和正常逻辑的代码分开.
|
l**********n 发帖数: 8443 | 30 goto
【在 c***5 的大作中提到】![](/moin_static193/solenoid/img/up.png) : Java一般什么情况下要throw exception呢,有设计原则吗?
|
|
|
b***i 发帖数: 3043 | 31 看这么多人讨论热火朝天,不如给你举个例子吧
一个BASIC解释程序,有个语句Statement的基类,然后各个语句实现了子类。子类必须
实现两个函数,doParse和execute,非别对应编译和执行过程。那么,doParse应该
throws SyntaxError,而execute应该throws RuntimeError。简单的做,就是在new
SyntaxError(...)的时候, 把行号和为什么错了放在构造函数里面,抛出异常。那么哪
里catch呢?程序应该有一个线程里面执行每一行程序,这个函数是所有子类execute()
的caller
..... throws RuntimeError {
try{
statement = statement.nextStatement();
statement.execute();
} catch(RuntimeError ex){
...此处并不printstack,也不强制退出,而是显示哪一行错了,为什么错了,然后
线程结束,程序回到编辑状态,用户可以修改,再次执行这个线程
}
}
总结,为什么抛异常?为了在caller或者更高层的caller那里统一处理异常,而不是每
个函数里面直接处理。这样,你改变处理的过程,在一个地方改就行了,而不是每个地
方都改。更一般的说,无法在函数里面进行处理,而是在caller那里处理在逻辑上更直
观,简单。比如函数里面不知道这种情况该怎么办,让呼叫着来处理。
Exception不是错误,而是函数知道自己无法处理而进行退出的办法,是控制程序流程
的办法。
【在 c***5 的大作中提到】![](/moin_static193/solenoid/img/up.png) : Java一般什么情况下要throw exception呢,有设计原则吗?
|
l******t 发帖数: 55733 | 32
这就是FP干的事啊
【在 d*******r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 问个问题,为什么语言不设计成让每一个 function 都能有一个返回值: unexpected_ : return_value, 然后所有函数的 caller 都必须强制 check和处理这个值呢? 这样算是 : 算用 return value 实现了 exception? : 我的意思是说,编程语言本身,在未知错误下,能确保 function 返回这个 : unexpected_return_value. : 当然,很久前学 C++ exception 时候,记得说 exception 还有个所谓好处: 把处理错 : 误的代码和正常逻辑的代码分开.
|
z****e 发帖数: 54598 | 33 fp出现的时间点远比oop要早
fp要能把所有问题都搞定,就不会有oop的今天
aop只是作为oop的补充,提倡用monad替代aop的多半是fp的狂热份子
【在 n*w 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 上次在一个f#会上speaker推荐用monad代替AOP。 说AOP带来的诸多问题。
|
z****e 发帖数: 54598 | 34 你说的不就是throws exception么?
你要是不想看到try catch灾难的话
直接把所有的方法的exception全部往上抛
一直抛到顶层来处理就是了
【在 d*******r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 问个问题,为什么语言不设计成让每一个 function 都能有一个返回值: unexpected_ : return_value, 然后所有函数的 caller 都必须强制 check和处理这个值呢? 这样算是 : 算用 return value 实现了 exception? : 我的意思是说,编程语言本身,在未知错误下,能确保 function 返回这个 : unexpected_return_value. : 当然,很久前学 C++ exception 时候,记得说 exception 还有个所谓好处: 把处理错 : 误的代码和正常逻辑的代码分开.
|
l******t 发帖数: 55733 | 35 maybe/option就解决了,你可以用map default处理也可以用getorelse catch也可以用
patten match强制编译器检查 scala future还有fail back
用monad可以彻底把context包起来而且不会像adt/aspect/动态语言那样侵犯语意
【在 z****e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : fp出现的时间点远比oop要早 : fp要能把所有问题都搞定,就不会有oop的今天 : aop只是作为oop的补充,提倡用monad替代aop的多半是fp的狂热份子
|
d*******r 发帖数: 3299 | 36 所以我一直有点怀疑这种方法,下层具体代码逻辑还处理不了的错误,顶层还是处理不
了啊
【在 z****e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 你说的不就是throws exception么? : 你要是不想看到try catch灾难的话 : 直接把所有的方法的exception全部往上抛 : 一直抛到顶层来处理就是了
|
q*c 发帖数: 9453 | 37 当然处理的了,context 不同。
比如上层可以通过判断抛弃这部分逻辑而处理。
处理不是恢复。
【在 d*******r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 所以我一直有点怀疑这种方法,下层具体代码逻辑还处理不了的错误,顶层还是处理不 : 了啊
|
z****e 发帖数: 54598 | 38 因为fp本来就包含有monad
而oop并不包含有aop
aop并不是必需,我只是用来做一个补充
不用也没啥大不了的,用也没多麻烦
但是要全部换成fp,那这个就比较痛苦了
思维容易乱,我自己都乱,传递给别人就更乱了
【在 l******t 的大作中提到】![](/moin_static193/solenoid/img/up.png) : maybe/option就解决了,你可以用map default处理也可以用getorelse catch也可以用 : patten match强制编译器检查 scala future还有fail back : 用monad可以彻底把context包起来而且不会像adt/aspect/动态语言那样侵犯语意
|
d*******r 发帖数: 3299 | 39 大牛说的是,
那还是可以像我在 11 楼说的,可以用强制处理 (恢复或者往上层return)的方式,用
unexpected_return_value 就实现 expectation 了吧. 就是说,不用新造一个叫
expectation 的新概念,就用现有的 funtion return value 就可以实现一样的功能了.
【在 q*c 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 当然处理的了,context 不同。 : 比如上层可以通过判断抛弃这部分逻辑而处理。 : 处理不是恢复。
|
p*****2 发帖数: 21240 | 40
用
了.
我觉得确实争议很大。就像你说的,人家Go就不设计exception。Scala也不推荐
exception
【在 d*******r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 大牛说的是, : 那还是可以像我在 11 楼说的,可以用强制处理 (恢复或者往上层return)的方式,用 : unexpected_return_value 就实现 expectation 了吧. 就是说,不用新造一个叫 : expectation 的新概念,就用现有的 funtion return value 就可以实现一样的功能了.
|
|
|
q*c 发帖数: 9453 | 41 可以。
不过当年看c , 有几个个专门的宏, joe,jon.jonz
jump on error
jump on zero
jump on non zero.
整个程序, 几乎行行开头都是这个宏。末尾是几个处理错误的 block. 不这样,那整
片都是 if.
也就是自己 implemebt exception throw.
人类的悲剧就是短命,结果经验教训无法延续。很多经验, 你不被打脸,就看书,那是
学不会的,哪怕很简单。
比如小妞妞明知道不做作业,10分钟后就没饭吃要倒霉,结果 it 就是不干。这种痛苦
要反复经历才能进入血液,真正成为自己的智慧,才能成长为大人。
因为我们就是这样的低等物种,智慧只能通过痛苦最学习,不能通过知识快速学习。
用
了.
【在 d*******r 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 大牛说的是, : 那还是可以像我在 11 楼说的,可以用强制处理 (恢复或者往上层return)的方式,用 : unexpected_return_value 就实现 expectation 了吧. 就是说,不用新造一个叫 : expectation 的新概念,就用现有的 funtion return value 就可以实现一样的功能了.
|
d*******r 发帖数: 3299 | 42 恩,是的
我看 Linux Kernel 里面有用 C 的 goto 来实现这种效果的.
【在 q*c 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 可以。 : 不过当年看c , 有几个个专门的宏, joe,jon.jonz : jump on error : jump on zero : jump on non zero. : 整个程序, 几乎行行开头都是这个宏。末尾是几个处理错误的 block. 不这样,那整 : 片都是 if. : 也就是自己 implemebt exception throw. : 人类的悲剧就是短命,结果经验教训无法延续。很多经验, 你不被打脸,就看书,那是 : 学不会的,哪怕很简单。
|
s********i 发帖数: 145 | 43 假设你的系统里面有某种资源的cache,系统每隔一段时间就会尝试更新cache,这个更
新过程可能会出错(throw exception),这个时候你是希望系统崩溃,还是catch
exception,然后继续用现有的cache... |
l******t 发帖数: 55733 | 44 monad是实现不是语言的一部分
【在 z****e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 因为fp本来就包含有monad : 而oop并不包含有aop : aop并不是必需,我只是用来做一个补充 : 不用也没啥大不了的,用也没多麻烦 : 但是要全部换成fp,那这个就比较痛苦了 : 思维容易乱,我自己都乱,传递给别人就更乱了
|
c******o 发帖数: 1277 | 45 catch 的目的是处理, 不然catch干嘛, 忽略就好了。
所以在能当时处理的时候就处理才是对的。
往上传的话只有不能处理才做。
【在 s********i 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 假设你的系统里面有某种资源的cache,系统每隔一段时间就会尝试更新cache,这个更 : 新过程可能会出错(throw exception),这个时候你是希望系统崩溃,还是catch : exception,然后继续用现有的cache...
|
a9 发帖数: 21638 | 46 你不觉得应该找出来为啥更新过程可能会出错吗?
【在 s********i 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 假设你的系统里面有某种资源的cache,系统每隔一段时间就会尝试更新cache,这个更 : 新过程可能会出错(throw exception),这个时候你是希望系统崩溃,还是catch : exception,然后继续用现有的cache...
|
s********i 发帖数: 145 | 47 当然要找出来 但是那是之后patch的时候。。。 你不能保证你的程序在production的
时候一定不出错吧,出错的时候runtime怎么办?肯定是catch exception, 能继续的就
继续,然后 page service engineer 起床来处理
【在 a9 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 你不觉得应该找出来为啥更新过程可能会出错吗?
|
z****e 发帖数: 54598 | 48 是fp的一部分
【在 l******t 的大作中提到】![](/moin_static193/solenoid/img/up.png) : monad是实现不是语言的一部分
|
z****e 发帖数: 54598 | 49 不只
一个是打断当前transaction
还有一个是比较初级的处理就是直接塞入log
便于将来查询,随便一个java系统,现在log里面exception估计都不少
很多是没处理的,但是放那边,真有啥问题,好查
【在 c******o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : catch 的目的是处理, 不然catch干嘛, 忽略就好了。 : 所以在能当时处理的时候就处理才是对的。 : 往上传的话只有不能处理才做。
|