开发者

Clean way to cancel object creation

I'm wondering how to stop/cancel the creation of an object, risen by new(). Maybe if some preconditions fail and the object isn't needed.

开发者_如何学Go
  • Check before new?
  • Check within constructor, returning null or something special, don't know how to handle ...
  • Check after new was successful and object is alive. Call a member function myObj->Init(). And destroy object if this fails?


None of the above.

If the object cannot be constructed because of unmet conditions, the constructor should throw an exception with the throw statement.


Check before new?

If your preconditions can be verified outside of the object's own inner scope and if they semantically belong in the calling scope, then sure... this is great!

Check within constructor, returning null or something special, don't know how to handle ...

Check within the constructor, and throw an exception. Handle it like you handle any other exception. Best approach.

Check after new was successful and object is alive. Call a member function myObj->Init(). And destroy object if this fails?

Abandoning RAII in this manner is a backwards step.


Throw an exception for the object's constructor. Note that the object's destructor will not be called, unlike operator delete, which will be called automatically to reclaim the allocated memory.


Maybe it's better to make lightweight constructor which always succeeds, and Initialize function that makes heavy work and throws exception on error.

Edit. After some critical feedback, I found why my suggestion doesn't meet RAII requirements: "Resources are acquired during initialization, when there is no chance of them being used before they are available".

I don't change my original post, it may be helpful to have this as typical design error sample.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜