由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C++的exception大家常用吗?
相关主题
请问C++ exception后如何清理function stack上的内存资源?c++ define 一问
C++ 的 exception handling[合集] 谁能知道这是为什么?C++问题
真是痛恨喜欢 throw 的猪Help - C++ Debug Assertion Failed
你们都检查这些system call的返回值吗?问一个奇怪的问题。
怎么准备一些hardcore C++的interview (转载)一个C#似疑模板问题
Java的例外处理问题什么情况下不用写throws问行C++代码
弱问:c++里面throw就相当于return了吧?基于macro的meta programming真难懂
使用assert应遵循什么原则?《新C++标准:C++0x 概述》英文文字版[PDF]
相关话题的讨论汇总
话题: exception话题: c++话题: code话题: 程序话题: try
进入Programming版参与讨论
1 (共1页)
g*********s
发帖数: 1782
1
我怎么觉得用着很别扭。这套机制处理错误有什么好处啊?
a****l
发帖数: 8211
2
我觉得什么好处都没有.exception的结果就是原先错误指令被系统强制杀死的程序变成
告诉你一个错误信息然后程序自愿死掉,反正结果都是死掉.

【在 g*********s 的大作中提到】
: 我怎么觉得用着很别扭。这套机制处理错误有什么好处啊?
k******r
发帖数: 2300
3
C++的exception 是独立于你的应用程序分开进行的,这是好处之一,设想如果使用返
回值,你就需要在原来的逻辑的基础上再加上处理返回值的逻辑,如果程序到处都是这
样的会显得很乱。

【在 g*********s 的大作中提到】
: 我怎么觉得用着很别扭。这套机制处理错误有什么好处啊?
g*********s
发帖数: 1782
4
现在到处都是try/throw/catch不也很乱吗?

【在 k******r 的大作中提到】
: C++的exception 是独立于你的应用程序分开进行的,这是好处之一,设想如果使用返
: 回值,你就需要在原来的逻辑的基础上再加上处理返回值的逻辑,如果程序到处都是这
: 样的会显得很乱。

k******r
发帖数: 2300
5
不是这样的,有了exception handling 程序可以继续进行。

【在 a****l 的大作中提到】
: 我觉得什么好处都没有.exception的结果就是原先错误指令被系统强制杀死的程序变成
: 告诉你一个错误信息然后程序自愿死掉,反正结果都是死掉.

k******r
发帖数: 2300
6
try/catch 是独立于你的应用程序的,我说的乱是逻辑上的乱,因为try/catch 逻辑上
是独立的,所以没有改变原来应用程序的逻辑。但是处理返回值就不一样,因为它已经
改变了原来程序的逻辑,使得原来的逻辑变复杂了。

【在 g*********s 的大作中提到】
: 现在到处都是try/throw/catch不也很乱吗?
g*********s
发帖数: 1782
7
这样带病运行不是更乱了吗。

【在 k******r 的大作中提到】
: 不是这样的,有了exception handling 程序可以继续进行。
p***o
发帖数: 1252
8
有个东西叫exception-safety,写库卖钱的要考虑一下,一般人写程序就算了吧。
C++ exception最不好的地方就是没有内置的函数显示调用栈。看看java/python
用exception多方便,也没听人抱怨过。

【在 g*********s 的大作中提到】
: 这样带病运行不是更乱了吗。
p***o
发帖数: 1252
9
try/catch在顶层用用就好,要不然跟用返回值没区别。
再说C++里又没有显式的finally,没必要到处放try。

【在 g*********s 的大作中提到】
: 现在到处都是try/throw/catch不也很乱吗?
k******r
发帖数: 2300
10
你想过没有,如果没有exception handling 在出现exception的时候会发生什么?程序
立刻结束了。但是有exception handling 程序不会退出,用户看到出错信息,然后可
以选择调整一下,重新作一遍。如果是程序本身的问题,可以报告软件商。

【在 g*********s 的大作中提到】
: 这样带病运行不是更乱了吗。
相关主题
Java的例外处理问题什么情况下不用写throwsc++ define 一问
弱问:c++里面throw就相当于return了吧?[合集] 谁能知道这是为什么?C++问题
使用assert应遵循什么原则?Help - C++ Debug Assertion Failed
进入Programming版参与讨论
k******r
发帖数: 2300
11
没有必要需要内置的函数显示调用栈,出现exception 停下来,查看当前的call stack
不就可以了吗。

【在 p***o 的大作中提到】
: 有个东西叫exception-safety,写库卖钱的要考虑一下,一般人写程序就算了吧。
: C++ exception最不好的地方就是没有内置的函数显示调用栈。看看java/python
: 用exception多方便,也没听人抱怨过。

g*********s
发帖数: 1782
12
举个例子?

【在 k******r 的大作中提到】
: 你想过没有,如果没有exception handling 在出现exception的时候会发生什么?程序
: 立刻结束了。但是有exception handling 程序不会退出,用户看到出错信息,然后可
: 以选择调整一下,重新作一遍。如果是程序本身的问题,可以报告软件商。

b******n
发帖数: 592
13
it depends. some errors application can deal with internally. I used to
implement in C a try block, all our functions use return code. our code
looks like this:
TRY( func1(a,b) );
TRY( func2(c,d) );
exception is lighter, and easier to organize than return code.
Another method we used was setjmp, mainly for non-recoverable errors.

【在 g*********s 的大作中提到】
: 这样带病运行不是更乱了吗。
p***o
发帖数: 1252
14
用户会看call stack?

stack

【在 k******r 的大作中提到】
: 没有必要需要内置的函数显示调用栈,出现exception 停下来,查看当前的call stack
: 不就可以了吗。

e****d
发帖数: 895
15
I think your question also applies to the exception handling of
other languages. If you are concerned about missing finally statement
or not being able to print out exception stacks, you can solve it by
proper RAII and exception chaining.

【在 g*********s 的大作中提到】
: 我怎么觉得用着很别扭。这套机制处理错误有什么好处啊?
k******r
发帖数: 2300
16
用户是不会看call stack, 但是用户也不会抱怨C++ exception 不好用。

【在 p***o 的大作中提到】
: 用户会看call stack?
:
: stack

b******n
发帖数: 592
17
In application level, you suppose to catch exceptions and convert to
readable
messages to user. Why do you have to show call stack to user?

【在 k******r 的大作中提到】
: 用户是不会看call stack, 但是用户也不会抱怨C++ exception 不好用。
b***i
发帖数: 3043
18
很多人不理解异常,是因为没有进行大规模的程序编写。当你的程序超过一万行,非常
复杂的时候,异常处理就非常方便了。
另外一点,异常并不是系统出错了,而是你自己产生错误信号和抓住错误信号。比如,
你的某个类的虚函数被子类实现了,每个子类都要用throw产生错误信号,而基类
的函数通过try调用子类实现的虚函数,并catch子类产生的错误信号,然后统
一处理。通过这种方式,程序实现了不同于正常return返回的方式,而是通过t
hrow被上面catch住,不用层层返回函数堆栈。错误信号Exception
也是你自己定义的类,其中可以包含所有出错的原因,子类的名字等信息,让错误处理
非常方便。
找几个高手的程序源代码,看明白,修改,就懂了。

【在 g*********s 的大作中提到】
: 我怎么觉得用着很别扭。这套机制处理错误有什么好处啊?
d***q
发帖数: 1119
19
C++的exception 是在stack上的..性能那个成问题..
现在大多人用用 反而用回原来的errorcode形式...
我日常用assert的多。。exception一般不用...

【在 p***o 的大作中提到】
: 有个东西叫exception-safety,写库卖钱的要考虑一下,一般人写程序就算了吧。
: C++ exception最不好的地方就是没有内置的函数显示调用栈。看看java/python
: 用exception多方便,也没听人抱怨过。

t****t
发帖数: 6806
20
你觉得别扭可能是因为你没有按照C++的风格来写程序. 如果你把C++作为一个C
superset来用, 那exception肯定不好用. 但是按照C++的风格, 把错误和正常返回的
path分开是很方便的. 随便举几个例子:
* 你可以在constructor里扔出异常. 部分分配的对象会被自动释放. error code不行.
* 你可以在overloaded operator里扔出异常. error code不行. 推广: 在你不能改变
function signature的时候, 异常很方便.
* 你不需要在每个叶子调用检查返回值. 可以在调用树较高的地方, 或者说方便报告出
错的地方, 接住异常并报告. 更重要的是, 你也不会忘记检查返回值. 比如说你不需要
在每个new检查是否返回0(事实上正常的new并不返回0, 除非你使用nothrow调用).
你需要做的:
* 除非你准备出错后立刻退出, 否则所有动态分配的内存和其它资源(file handle,
socket, sync lock, etc)必需能够自动释放. 你需要使用容器(STL container),
smart pointer(shared_ptr<>, unique_ptr<>), 同步类及锁(mutex, unique_lock<>)
等类来包装指针/资源. 裸指针在使用异常的程序基本上是很危险的.
* 不要在一个模块里混合error return code和exception. 在写程序之前就想好, 哪一
块用return code, 哪一块用exception. 比如说, 我需要调用bison产生的parser, 这
个本质上是个C程序, 它使用return code. 那里我在yacc file里给出的code snipet就
需要使用return code而不是exception. 你可以在yylex的入口处检查return code并翻
译成exception以供更上层使用.
performance hit可能是有的, 取决于你用的compiler. 但是绝大多数情况下, 可以说
你90%的程序不需要考虑这个. 核心循环可以在作profile后慢慢优化.

【在 g*********s 的大作中提到】
: 我怎么觉得用着很别扭。这套机制处理错误有什么好处啊?
相关主题
问一个奇怪的问题。基于macro的meta programming真难懂
一个C#似疑模板问题《新C++标准:C++0x 概述》英文文字版[PDF]
问行C++代码C++中parse string的问题
进入Programming版参与讨论
b******n
发帖数: 592
21
assert is different than exception. And assert depends on the build, you
only
have it in DEBUG build. when assert fails, the program has to terminate.
Imagine
a library you use has all asserts, no error code. In your case,
assert is a exception you never catch, meaning you can't use that exception
information to recover or do anything.
of course there is a proformance hit. You shouldn't worry about it anyway.
normally it is not an issue to write safer code while losing a little bit
on performance. If it is an issue, you probably shouldn't use C++. The exact
code on C++ is about 1% slower than C for us. Either you want safe but
slower
code or you want fast but not-safe..your choice.

【在 d***q 的大作中提到】
: C++的exception 是在stack上的..性能那个成问题..
: 现在大多人用用 反而用回原来的errorcode形式...
: 我日常用assert的多。。exception一般不用...

b********n
发帖数: 609
22
我靠,您从哪整来这些中文术语,看的我累死了。

行.

【在 t****t 的大作中提到】
: 你觉得别扭可能是因为你没有按照C++的风格来写程序. 如果你把C++作为一个C
: superset来用, 那exception肯定不好用. 但是按照C++的风格, 把错误和正常返回的
: path分开是很方便的. 随便举几个例子:
: * 你可以在constructor里扔出异常. 部分分配的对象会被自动释放. error code不行.
: * 你可以在overloaded operator里扔出异常. error code不行. 推广: 在你不能改变
: function signature的时候, 异常很方便.
: * 你不需要在每个叶子调用检查返回值. 可以在调用树较高的地方, 或者说方便报告出
: 错的地方, 接住异常并报告. 更重要的是, 你也不会忘记检查返回值. 比如说你不需要
: 在每个new检查是否返回0(事实上正常的new并不返回0, 除非你使用nothrow调用).
: 你需要做的:

t****t
发帖数: 6806
23
这不都是标准的术语吗?

【在 b********n 的大作中提到】
: 我靠,您从哪整来这些中文术语,看的我累死了。
:
: 行.

g*****y
发帖数: 7271
24
使用exception的一个好处就是不用每call一个可能fail的function都要check返回值并
进一步返回到上一层。而是只是在你知道如何处理错误情况时才try/catch。这多半是
在相当upper level的funcion里。
如果你的程序里有很多try/catch的话,多半不是一个好的design。我非常痛恨程序里
看见一堆的try/catch。

【在 k******r 的大作中提到】
: try/catch 是独立于你的应用程序的,我说的乱是逻辑上的乱,因为try/catch 逻辑上
: 是独立的,所以没有改变原来应用程序的逻辑。但是处理返回值就不一样,因为它已经
: 改变了原来程序的逻辑,使得原来的逻辑变复杂了。

e****d
发帖数: 895
25
Another benefit to use exceptions is to categarize errors by exception
inheritance.

【在 g*****y 的大作中提到】
: 使用exception的一个好处就是不用每call一个可能fail的function都要check返回值并
: 进一步返回到上一层。而是只是在你知道如何处理错误情况时才try/catch。这多半是
: 在相当upper level的funcion里。
: 如果你的程序里有很多try/catch的话,多半不是一个好的design。我非常痛恨程序里
: 看见一堆的try/catch。

1 (共1页)
进入Programming版参与讨论
相关主题
《新C++标准:C++0x 概述》英文文字版[PDF]怎么准备一些hardcore C++的interview (转载)
C++中parse string的问题Java的例外处理问题什么情况下不用写throws
c语言abort时怎么清理堆空间?弱问:c++里面throw就相当于return了吧?
输入参数的检查应该归caller还是callee?使用assert应遵循什么原则?
请问C++ exception后如何清理function stack上的内存资源?c++ define 一问
C++ 的 exception handling[合集] 谁能知道这是为什么?C++问题
真是痛恨喜欢 throw 的猪Help - C++ Debug Assertion Failed
你们都检查这些system call的返回值吗?问一个奇怪的问题。
相关话题的讨论汇总
话题: exception话题: c++话题: code话题: 程序话题: try