こういう時どうすればいいのか教えてください

HANDLE h = open(...);
OBJ *o = new OBJ(h);
return o;

上記の用に、OBJのコンストラクタに
ハンドルを渡す必要があるのだけど
エラー処理を追加すると、メモリ確保に失敗した場合
オープンして、すぐクローズする羽目になる。

HANDLE h = open(...);
try { OBJ *o = new OBJ(h); }
catch (std::bad_alloc& e) { close(h); throw error; }

処理の流れ的には、メモリ確保に成功したらオープンして〜
というほうが自然なのだけど、ハンドルを受け取る
コンストラクタしかないので出来ない。

さらにopen()やclose()も失敗する可能性があるので
その処理も追加すると、煩雑になってしまう。
なにかいい方法ありませんか?