由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - Exception
相关主题
请教:函数后面的 throw() 有意义么?看了一下monad,让我想到了Java的AOP
王银看kotlin(本文建议零售价 ¥15)大家对checked exception怎么看
C++ Q15: throw老年转行工程师问问C++11基本问题
Java的例外处理问题什么情况下不用写throwsC++的exception大家常用吗?
Two questions about handling exceptions in C++弱问:c++里面throw就相当于return了吧?
C++虚方法问题A try-catch problem in C++
[合集] 基类函数已经是virtual了,为啥子类还要virtual啊?C++ 用户定义exception的标准用法是什么?
我老给你们指条明路吧大家对 exception 都是怎么处理的?
相关话题的讨论汇总
话题: exception话题: 处理话题: aop话题: 函数话题: catch
进入Programming版参与讨论
1 (共1页)
c***5
发帖数: 158
1
Java一般什么情况下要throw exception呢,有设计原则吗?
p*****2
发帖数: 21240
2
java 的 exception 是一个bad design

【在 c***5 的大作中提到】
: Java一般什么情况下要throw exception呢,有设计原则吗?
m******e
发帖数: 201
3
没有exception怎么fail early, 一堆if else?
Exception在大型系统里帮助快速找到问题

【在 p*****2 的大作中提到】
: java 的 exception 是一个bad design
l*******b
发帖数: 2586
4
都是这样的?哈哈哈
catch ( Exception e)
{ print(e.stacktrace()); }

【在 m******e 的大作中提到】
: 没有exception怎么fail early, 一堆if else?
: Exception在大型系统里帮助快速找到问题

p*****2
发帖数: 21240
5

zhaoce不是说了吗?AOP可以搞定,Monad也可以搞定。

【在 m******e 的大作中提到】
: 没有exception怎么fail early, 一堆if else?
: Exception在大型系统里帮助快速找到问题

z****e
发帖数: 54598
6
我觉得exception更无脑一点
如果不用exception,那就需要把所有情况都考虑到才行
用aop其实只是简化了代码的书写
不会出现try catch 灾难,但是本质上是一样的

【在 p*****2 的大作中提到】
:
: zhaoce不是说了吗?AOP可以搞定,Monad也可以搞定。

o***g
发帖数: 2784
7
个人理解
异常都是在整个任务没法干的情况下才抛
比如登陆,数据库连不上了,得抛异常,是登陆这事儿没法干。如果用户名密码不匹配
,不能抛异常,该返回false就返回false。
还有哪一层抓异常也有讲究
还有的时候需要用assert

【在 c***5 的大作中提到】
: Java一般什么情况下要throw exception呢,有设计原则吗?
d*******r
发帖数: 3299
8
一直没搞懂 Exception 的必要性,虽然以前写 C++ 时候也用.
如果真这么必要,那 C 或者 Go 岂不是很难用? Go 还专门就不设计 Exception 呢.
n*w
发帖数: 3393
9
上次在一个f#会上speaker推荐用monad代替AOP。 说AOP带来的诸多问题。

【在 p*****2 的大作中提到】
:
: zhaoce不是说了吗?AOP可以搞定,Monad也可以搞定。

p***o
发帖数: 1252
10
Go没用过,你要写个C函数管理几个资源,保证每个错误都处理到以及函数返回之前把
东西清干净就不是件容易的事,更别提让你过段时间或者让别人来维护这段代码了。

【在 d*******r 的大作中提到】
: 一直没搞懂 Exception 的必要性,虽然以前写 C++ 时候也用.
: 如果真这么必要,那 C 或者 Go 岂不是很难用? Go 还专门就不设计 Exception 呢.

相关主题
C++虚方法问题看了一下monad,让我想到了Java的AOP
[合集] 基类函数已经是virtual了,为啥子类还要virtual啊?大家对checked exception怎么看
我老给你们指条明路吧老年转行工程师问问C++11基本问题
进入Programming版参与讨论
d*******r
发帖数: 3299
11
问个问题,为什么语言不设计成让每一个 function 都能有一个返回值: unexpected_
return_value, 然后所有函数的 caller 都必须强制 check和处理这个值呢? 这样算是
算用 return value 实现了 exception?
我的意思是说,编程语言本身,在未知错误下,能确保 function 返回这个
unexpected_return_value.
当然,很久前学 C++ exception 时候,记得说 exception 还有个所谓好处: 把处理错
误的代码和正常逻辑的代码分开.

【在 p***o 的大作中提到】
: Go没用过,你要写个C函数管理几个资源,保证每个错误都处理到以及函数返回之前把
: 东西清干净就不是件容易的事,更别提让你过段时间或者让别人来维护这段代码了。

p***o
发帖数: 1252
12
你这不是都知道么 ...
用exception把处理错误代码和正常流程分开。exception确实是强制处理的,只不过
不一定要在caller处理,你不处理程序直接退出。抛exception的地方和处理exception
地方之间靠finally或者stack unwinding清理资源。当然很多时候finally也不方便,
你看C#和Java或早或迟也加入了类似stack unwinding的try with。

【在 d*******r 的大作中提到】
: 问个问题,为什么语言不设计成让每一个 function 都能有一个返回值: unexpected_
: return_value, 然后所有函数的 caller 都必须强制 check和处理这个值呢? 这样算是
: 算用 return value 实现了 exception?
: 我的意思是说,编程语言本身,在未知错误下,能确保 function 返回这个
: unexpected_return_value.
: 当然,很久前学 C++ exception 时候,记得说 exception 还有个所谓好处: 把处理错
: 误的代码和正常逻辑的代码分开.

l**********n
发帖数: 8443
13
goto

【在 c***5 的大作中提到】
: 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 的大作中提到】
: Java一般什么情况下要throw exception呢,有设计原则吗?
l******t
发帖数: 55733
15

这就是FP干的事啊

【在 d*******r 的大作中提到】
: 问个问题,为什么语言不设计成让每一个 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 的大作中提到】
: 上次在一个f#会上speaker推荐用monad代替AOP。 说AOP带来的诸多问题。
z****e
发帖数: 54598
17
你说的不就是throws exception么?
你要是不想看到try catch灾难的话
直接把所有的方法的exception全部往上抛
一直抛到顶层来处理就是了

【在 d*******r 的大作中提到】
: 问个问题,为什么语言不设计成让每一个 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 的大作中提到】
: Java一般什么情况下要throw exception呢,有设计原则吗?
m******e
发帖数: 201
20
没有exception怎么fail early, 一堆if else?
Exception在大型系统里帮助快速找到问题

【在 p*****2 的大作中提到】
: java 的 exception 是一个bad design
相关主题
C++的exception大家常用吗?C++ 用户定义exception的标准用法是什么?
弱问:c++里面throw就相当于return了吧?大家对 exception 都是怎么处理的?
A try-catch problem in C++C++ Q17: throw 2
进入Programming版参与讨论
l*******b
发帖数: 2586
21
都是这样的?哈哈哈
catch ( Exception e)
{ print(e.stacktrace()); }

【在 m******e 的大作中提到】
: 没有exception怎么fail early, 一堆if else?
: Exception在大型系统里帮助快速找到问题

p*****2
发帖数: 21240
22

zhaoce不是说了吗?AOP可以搞定,Monad也可以搞定。

【在 m******e 的大作中提到】
: 没有exception怎么fail early, 一堆if else?
: Exception在大型系统里帮助快速找到问题

z****e
发帖数: 54598
23
我觉得exception更无脑一点
如果不用exception,那就需要把所有情况都考虑到才行
用aop其实只是简化了代码的书写
不会出现try catch 灾难,但是本质上是一样的

【在 p*****2 的大作中提到】
:
: zhaoce不是说了吗?AOP可以搞定,Monad也可以搞定。

o***g
发帖数: 2784
24
个人理解
异常都是在整个任务没法干的情况下才抛
比如登陆,数据库连不上了,得抛异常,是登陆这事儿没法干。如果用户名密码不匹配
,不能抛异常,该返回false就返回false。
还有哪一层抓异常也有讲究
还有的时候需要用assert

【在 c***5 的大作中提到】
: Java一般什么情况下要throw exception呢,有设计原则吗?
d*******r
发帖数: 3299
25
一直没搞懂 Exception 的必要性,虽然以前写 C++ 时候也用.
如果真这么必要,那 C 或者 Go 岂不是很难用? Go 还专门就不设计 Exception 呢.
n*w
发帖数: 3393
26
上次在一个f#会上speaker推荐用monad代替AOP。 说AOP带来的诸多问题。

【在 p*****2 的大作中提到】
:
: zhaoce不是说了吗?AOP可以搞定,Monad也可以搞定。

p***o
发帖数: 1252
27
Go没用过,你要写个C函数管理几个资源,保证每个错误都处理到以及函数返回之前把
东西清干净就不是件容易的事,更别提让你过段时间或者让别人来维护这段代码了。

【在 d*******r 的大作中提到】
: 一直没搞懂 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 的大作中提到】
: Go没用过,你要写个C函数管理几个资源,保证每个错误都处理到以及函数返回之前把
: 东西清干净就不是件容易的事,更别提让你过段时间或者让别人来维护这段代码了。

p***o
发帖数: 1252
29
你这不是都知道么 ...
用exception把处理错误代码和正常流程分开。exception确实是强制处理的,只不过
不一定要在caller处理,你不处理程序直接退出。抛exception的地方和处理exception
地方之间靠finally或者stack unwinding清理资源。当然很多时候finally也不方便,
你看C#和Java或早或迟也加入了类似stack unwinding的try with。

【在 d*******r 的大作中提到】
: 问个问题,为什么语言不设计成让每一个 function 都能有一个返回值: unexpected_
: return_value, 然后所有函数的 caller 都必须强制 check和处理这个值呢? 这样算是
: 算用 return value 实现了 exception?
: 我的意思是说,编程语言本身,在未知错误下,能确保 function 返回这个
: unexpected_return_value.
: 当然,很久前学 C++ exception 时候,记得说 exception 还有个所谓好处: 把处理错
: 误的代码和正常逻辑的代码分开.

l**********n
发帖数: 8443
30
goto

【在 c***5 的大作中提到】
: Java一般什么情况下要throw exception呢,有设计原则吗?
相关主题
请教一个c++ throw exception 问题王银看kotlin(本文建议零售价 ¥15)
C++ try {} catch(...){} 能扑捉一切异常吗?C++ Q15: throw
请教:函数后面的 throw() 有意义么?Java的例外处理问题什么情况下不用写throws
进入Programming版参与讨论
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 的大作中提到】
: Java一般什么情况下要throw exception呢,有设计原则吗?
l******t
发帖数: 55733
32

这就是FP干的事啊

【在 d*******r 的大作中提到】
: 问个问题,为什么语言不设计成让每一个 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 的大作中提到】
: 上次在一个f#会上speaker推荐用monad代替AOP。 说AOP带来的诸多问题。
z****e
发帖数: 54598
34
你说的不就是throws exception么?
你要是不想看到try catch灾难的话
直接把所有的方法的exception全部往上抛
一直抛到顶层来处理就是了

【在 d*******r 的大作中提到】
: 问个问题,为什么语言不设计成让每一个 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 的大作中提到】
: fp出现的时间点远比oop要早
: fp要能把所有问题都搞定,就不会有oop的今天
: aop只是作为oop的补充,提倡用monad替代aop的多半是fp的狂热份子

d*******r
发帖数: 3299
36
所以我一直有点怀疑这种方法,下层具体代码逻辑还处理不了的错误,顶层还是处理不
了啊

【在 z****e 的大作中提到】
: 你说的不就是throws exception么?
: 你要是不想看到try catch灾难的话
: 直接把所有的方法的exception全部往上抛
: 一直抛到顶层来处理就是了

q*c
发帖数: 9453
37
当然处理的了,context 不同。
比如上层可以通过判断抛弃这部分逻辑而处理。
处理不是恢复。

【在 d*******r 的大作中提到】
: 所以我一直有点怀疑这种方法,下层具体代码逻辑还处理不了的错误,顶层还是处理不
: 了啊

z****e
发帖数: 54598
38
因为fp本来就包含有monad
而oop并不包含有aop
aop并不是必需,我只是用来做一个补充
不用也没啥大不了的,用也没多麻烦
但是要全部换成fp,那这个就比较痛苦了
思维容易乱,我自己都乱,传递给别人就更乱了

【在 l******t 的大作中提到】
: 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 的大作中提到】
: 当然处理的了,context 不同。
: 比如上层可以通过判断抛弃这部分逻辑而处理。
: 处理不是恢复。

p*****2
发帖数: 21240
40


了.
我觉得确实争议很大。就像你说的,人家Go就不设计exception。Scala也不推荐
exception

【在 d*******r 的大作中提到】
: 大牛说的是,
: 那还是可以像我在 11 楼说的,可以用强制处理 (恢复或者往上层return)的方式,用
: unexpected_return_value 就实现 expectation 了吧. 就是说,不用新造一个叫
: expectation 的新概念,就用现有的 funtion return value 就可以实现一样的功能了.

相关主题
Java的例外处理问题什么情况下不用写throws[合集] 基类函数已经是virtual了,为啥子类还要virtual啊?
Two questions about handling exceptions in C++我老给你们指条明路吧
C++虚方法问题看了一下monad,让我想到了Java的AOP
进入Programming版参与讨论
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 的大作中提到】
: 大牛说的是,
: 那还是可以像我在 11 楼说的,可以用强制处理 (恢复或者往上层return)的方式,用
: unexpected_return_value 就实现 expectation 了吧. 就是说,不用新造一个叫
: expectation 的新概念,就用现有的 funtion return value 就可以实现一样的功能了.

d*******r
发帖数: 3299
42
恩,是的
我看 Linux Kernel 里面有用 C 的 goto 来实现这种效果的.

【在 q*c 的大作中提到】
: 可以。
: 不过当年看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 的大作中提到】
: 因为fp本来就包含有monad
: 而oop并不包含有aop
: aop并不是必需,我只是用来做一个补充
: 不用也没啥大不了的,用也没多麻烦
: 但是要全部换成fp,那这个就比较痛苦了
: 思维容易乱,我自己都乱,传递给别人就更乱了

c******o
发帖数: 1277
45
catch 的目的是处理, 不然catch干嘛, 忽略就好了。
所以在能当时处理的时候就处理才是对的。
往上传的话只有不能处理才做。

【在 s********i 的大作中提到】
: 假设你的系统里面有某种资源的cache,系统每隔一段时间就会尝试更新cache,这个更
: 新过程可能会出错(throw exception),这个时候你是希望系统崩溃,还是catch
: exception,然后继续用现有的cache...

a9
发帖数: 21638
46
你不觉得应该找出来为啥更新过程可能会出错吗?

【在 s********i 的大作中提到】
: 假设你的系统里面有某种资源的cache,系统每隔一段时间就会尝试更新cache,这个更
: 新过程可能会出错(throw exception),这个时候你是希望系统崩溃,还是catch
: exception,然后继续用现有的cache...

s********i
发帖数: 145
47
当然要找出来 但是那是之后patch的时候。。。 你不能保证你的程序在production的
时候一定不出错吧,出错的时候runtime怎么办?肯定是catch exception, 能继续的就
继续,然后 page service engineer 起床来处理

【在 a9 的大作中提到】
: 你不觉得应该找出来为啥更新过程可能会出错吗?
z****e
发帖数: 54598
48
是fp的一部分

【在 l******t 的大作中提到】
: monad是实现不是语言的一部分
z****e
发帖数: 54598
49
不只
一个是打断当前transaction
还有一个是比较初级的处理就是直接塞入log
便于将来查询,随便一个java系统,现在log里面exception估计都不少
很多是没处理的,但是放那边,真有啥问题,好查

【在 c******o 的大作中提到】
: catch 的目的是处理, 不然catch干嘛, 忽略就好了。
: 所以在能当时处理的时候就处理才是对的。
: 往上传的话只有不能处理才做。

1 (共1页)
进入Programming版参与讨论
相关主题
大家对 exception 都是怎么处理的?Two questions about handling exceptions in C++
C++ Q17: throw 2C++虚方法问题
请教一个c++ throw exception 问题[合集] 基类函数已经是virtual了,为啥子类还要virtual啊?
C++ try {} catch(...){} 能扑捉一切异常吗?我老给你们指条明路吧
请教:函数后面的 throw() 有意义么?看了一下monad,让我想到了Java的AOP
王银看kotlin(本文建议零售价 ¥15)大家对checked exception怎么看
C++ Q15: throw老年转行工程师问问C++11基本问题
Java的例外处理问题什么情况下不用写throwsC++的exception大家常用吗?
相关话题的讨论汇总
话题: exception话题: 处理话题: aop话题: 函数话题: catch