由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C++ 的 exception handling
相关主题
请问C++ exception后如何清理function stack上的内存资源?Two questions about handling exceptions in C++
几个问题为什么用try catch不住exception?
C++的exception大家常用吗?C++的很多library到底是趋于集中,还是各个公司独自开发,各立山头
真是痛恨喜欢 throw 的猪弱问:c++里面throw就相当于return了吧?
请教一下,exception时,destructor一定会被调用么?A try-catch problem in C++
有大侠讲讲RTTI和exception的问题么?有一事我一直就是不明白
关于内存泄漏c++的问题
一个Quant Developer的C++面试题请教一个c++ throw exception 问题
相关话题的讨论汇总
话题: c++话题: finally话题: exception话题: handling话题: destructor
进入Programming版参与讨论
1 (共1页)
x**n
发帖数: 461
1
请教各位高手:
其他的语言例如Java, C#有try/catch/finally,可是C++只有try/catch。如何能够简
单实现 try/catch/finally 呢?
还有,为什么C++不实现这个功能?我想一定有其原因的,有没有高手指点一下。
p***o
发帖数: 1252
2
析构函数

【在 x**n 的大作中提到】
: 请教各位高手:
: 其他的语言例如Java, C#有try/catch/finally,可是C++只有try/catch。如何能够简
: 单实现 try/catch/finally 呢?
: 还有,为什么C++不实现这个功能?我想一定有其原因的,有没有高手指点一下。

x**n
发帖数: 461
3
这个恐怕不行,假如在一个function里面的临时作了memory allocation,然后有
exception,在这种情况下destructor肯定不起作用。

【在 p***o 的大作中提到】
: 析构函数
p***o
发帖数: 1252
4
What are you talking about?
For exception safety, you should always wrap memory allocations, e.g. by
using smart pointers.

【在 x**n 的大作中提到】
: 这个恐怕不行,假如在一个function里面的临时作了memory allocation,然后有
: exception,在这种情况下destructor肯定不起作用。

x**n
发帖数: 461
5
I am not talking about memory management, I am talking about exception
handling.

【在 p***o 的大作中提到】
: What are you talking about?
: For exception safety, you should always wrap memory allocations, e.g. by
: using smart pointers.

p***o
发帖数: 1252
6
异常处理的目的不是处理异常,而是管理资源的生存期,以及更广泛地说对象的一致性。
生存期的话,用析构函数就好,和finally有些类似。一致性就不是这里三言两语能说
清楚的了。

【在 x**n 的大作中提到】
: I am not talking about memory management, I am talking about exception
: handling.

g*****g
发帖数: 34805
7
最大的问题是如果在catch里出现了新的异常,没有finally的话
不能保证资源得到释放吧。

性。

【在 p***o 的大作中提到】
: 异常处理的目的不是处理异常,而是管理资源的生存期,以及更广泛地说对象的一致性。
: 生存期的话,用析构函数就好,和finally有些类似。一致性就不是这里三言两语能说
: 清楚的了。

p***o
发帖数: 1252
8
catch里可以往外抛异常把。
对于析构函数,stack unwinding的时候出异常的话,程序直接就结束了。

【在 g*****g 的大作中提到】
: 最大的问题是如果在catch里出现了新的异常,没有finally的话
: 不能保证资源得到释放吧。
:
: 性。

x**n
发帖数: 461
9
关键就是我想要一个象finally一样的机制,可以保证资源释放,同时程序又不要太难
看。
微软有一个__try{}__finally{} extension,是不是我可以把try{}catch{} block放在
__try{} block里面,不知道这样有没有问题?
如果不是在微软环境下,而是standard C++下,那又该怎么办呢?

【在 g*****g 的大作中提到】
: 最大的问题是如果在catch里出现了新的异常,没有finally的话
: 不能保证资源得到释放吧。
:
: 性。

t****t
发帖数: 6806
10
C++ exception的资源释放一般是通过自动变量的destructor自动做的, 就是说不管什
么理由离开了这个scope, 那么auto variable的dtor就会被调用. 这个就相当于
finally.

【在 x**n 的大作中提到】
: 关键就是我想要一个象finally一样的机制,可以保证资源释放,同时程序又不要太难
: 看。
: 微软有一个__try{}__finally{} extension,是不是我可以把try{}catch{} block放在
: __try{} block里面,不知道这样有没有问题?
: 如果不是在微软环境下,而是standard C++下,那又该怎么办呢?

相关主题
有大侠讲讲RTTI和exception的问题么?Two questions about handling exceptions in C++
关于内存泄漏为什么用try catch不住exception?
一个Quant Developer的C++面试题C++的很多library到底是趋于集中,还是各个公司独自开发,各立山头
进入Programming版参与讨论
x**n
发帖数: 461
11
而且我确实不明白,对一个local scope的资源,destructor能帮上什么忙?
g*****g
发帖数: 34805
12
This sounds problemic. try catch finally is always in the same function,
so in finally it's easy to release any resource try may have opened.
destructor does not have access to local variables of other functions.

【在 t****t 的大作中提到】
: C++ exception的资源释放一般是通过自动变量的destructor自动做的, 就是说不管什
: 么理由离开了这个scope, 那么auto variable的dtor就会被调用. 这个就相当于
: finally.

x**n
发帖数: 461
13
是不是应该用object来把resource封装起来,因为object的destructor最终反正会被调
用的,资源会在那里自然释放。

【在 x**n 的大作中提到】
: 而且我确实不明白,对一个local scope的资源,destructor能帮上什么忙?
t****t
发帖数: 6806
14
是这个意思.

【在 x**n 的大作中提到】
: 是不是应该用object来把resource封装起来,因为object的destructor最终反正会被调
: 用的,资源会在那里自然释放。

x**n
发帖数: 461
15
明白了,就像我刚想到的那样,多谢你们三个的帮助。

【在 t****t 的大作中提到】
: C++ exception的资源释放一般是通过自动变量的destructor自动做的, 就是说不管什
: 么理由离开了这个scope, 那么auto variable的dtor就会被调用. 这个就相当于
: finally.

t****t
发帖数: 6806
16
auto variable always stays in the same function as well.
oh, auto variable == your local variable.

【在 g*****g 的大作中提到】
: This sounds problemic. try catch finally is always in the same function,
: so in finally it's easy to release any resource try may have opened.
: destructor does not have access to local variables of other functions.

x**n
发帖数: 461
17
还是觉得finally的机制可能更好一些。要不然需要自己写一些非常tricky的class,当
然,如果只是memory,boost做的很好了,但对custom resource,这是一个很头疼的问
题。

【在 t****t 的大作中提到】
: auto variable always stays in the same function as well.
: oh, auto variable == your local variable.

t****t
发帖数: 6806
18
finally用起来当然爽一些, 但是有时容易忘记. 包装起来绝对不存在这个问题, 不过
包装的时候会不会忘记就是另外一回事了.

【在 x**n 的大作中提到】
: 还是觉得finally的机制可能更好一些。要不然需要自己写一些非常tricky的class,当
: 然,如果只是memory,boost做的很好了,但对custom resource,这是一个很头疼的问
: 题。

x**n
发帖数: 461
19
包装的时候当然不会忘记的,这都忘记了肯定该打屁股。
问题是ownership和reference count,特别是如果变态不让用boost的话,那就很惨了。

【在 t****t 的大作中提到】
: finally用起来当然爽一些, 但是有时容易忘记. 包装起来绝对不存在这个问题, 不过
: 包装的时候会不会忘记就是另外一回事了.

t****t
发帖数: 6806
20
什么都不给用也不行啊. boost不能用的话, tr1让不让用啊? tr1不让用的话, stl是不
是也不能用啊...

了。

【在 x**n 的大作中提到】
: 包装的时候当然不会忘记的,这都忘记了肯定该打屁股。
: 问题是ownership和reference count,特别是如果变态不让用boost的话,那就很惨了。

相关主题
弱问:c++里面throw就相当于return了吧?c++的问题
A try-catch problem in C++请教一个c++ throw exception 问题
有一事我一直就是不明白什么时候使用c++ smart pointer?
进入Programming版参与讨论
x**n
发帖数: 461
21
那可难说了,俺们这里可是有雪儿级别的。还好,即使我每天跟他吵架,他也把我没辙。
不过这几个中间,还是觉得boost最好用。而且特别烦ms的extension。

【在 t****t 的大作中提到】
: 什么都不给用也不行啊. boost不能用的话, tr1让不让用啊? tr1不让用的话, stl是不
: 是也不能用啊...
:
: 了。

p***o
发帖数: 1252
22
你要是只用一种compiler,把boost里相关的部分扒出来自己实现一下也不麻烦,做工程
估计不会用到boost里面那些变态的部分把 ...

辙。

【在 x**n 的大作中提到】
: 那可难说了,俺们这里可是有雪儿级别的。还好,即使我每天跟他吵架,他也把我没辙。
: 不过这几个中间,还是觉得boost最好用。而且特别烦ms的extension。

h***i
发帖数: 1970
23
tr1是标准了,为啥不让用。g++的tr1中的shared pointer就是boost的实现。

辙。

【在 x**n 的大作中提到】
: 那可难说了,俺们这里可是有雪儿级别的。还好,即使我每天跟他吵架,他也把我没辙。
: 不过这几个中间,还是觉得boost最好用。而且特别烦ms的extension。

g*****y
发帖数: 7271
24
常用资源像memory,file之类的,自然有smart pointer,stream
之类的。不常用的资源,去看一看 ScopedGuard 一类的RAII design吧。例如 http://www.ddj.com/cpp/184403758
比finally好用多了。finally 主要是给没有deterministic destructor 的语言用的。
如果用到的资源比较多,还有dependency的话,能给人烦死。

【在 x**n 的大作中提到】
: 还是觉得finally的机制可能更好一些。要不然需要自己写一些非常tricky的class,当
: 然,如果只是memory,boost做的很好了,但对custom resource,这是一个很头疼的问
: 题。

h***i
发帖数: 1970
25
深表赞同,这种模式之所以叫idiom,不叫pattern,就是由于一些语言不支持
deterministic destructor

【在 g*****y 的大作中提到】
: 常用资源像memory,file之类的,自然有smart pointer,stream
: 之类的。不常用的资源,去看一看 ScopedGuard 一类的RAII design吧。例如 http://www.ddj.com/cpp/184403758
: 比finally好用多了。finally 主要是给没有deterministic destructor 的语言用的。
: 如果用到的资源比较多,还有dependency的话,能给人烦死。

1 (共1页)
进入Programming版参与讨论
相关主题
请教一个c++ throw exception 问题请教一下,exception时,destructor一定会被调用么?
什么时候使用c++ smart pointer?有大侠讲讲RTTI和exception的问题么?
大家对 exception 都是怎么处理的?关于内存泄漏
C++ try {} catch(...){} 能扑捉一切异常吗?一个Quant Developer的C++面试题
请问C++ exception后如何清理function stack上的内存资源?Two questions about handling exceptions in C++
几个问题为什么用try catch不住exception?
C++的exception大家常用吗?C++的很多library到底是趋于集中,还是各个公司独自开发,各立山头
真是痛恨喜欢 throw 的猪弱问:c++里面throw就相当于return了吧?
相关话题的讨论汇总
话题: c++话题: finally话题: exception话题: handling话题: destructor