C++并不禁止析构函数抛出异常,但是这极容易出问题。假设一个类的析构函数抛出异常,现在你要销毁有10个此类对象的链表,就有可能同时抛出10个异常,这种情况下会导致程序结束或其他不确定行为。甚至有时只是一个析构函数抛出异常就会出错。
一、怎么不让析构函数抛出异常
这里有两个解决方案:主动停止程序和吞下异常:
上面的代码演示的就是主动停止程序方案,有时突然结束程序显得很突然,或者只是个无关紧要的异常,那么我们可以选择吞下异常:
吞下异常其实就是不再调用【std::abort();】结束程序,通常并不推荐这样做,但总比突然结束程序或者抛出异常产生不确定行为要好。
二、通过用户自己解决异常
上面不让析构函数抛出异常的解决方案都不怎么完美,其实我们可以把解决异常这件事交给用户。比如这样写:
这样就做到了双保险,用户要自己调用【fun()】函数并解决异常,如果用户不调用,我们在析构里给个保险,但最终结果由用户承担。其实说到这会发现很多代码都是采用了这个方案,比如那些你必须自己去【close()】的数据库、资源等等。
