Throwing exceptions in destructors
richard.furse@...
Hi there – I’m just taking a look through some of the OpenMAMA code and have a question. Is this the right place it?
The code I have (OpenMAMA 2.2.1.1) contains the following:
MamaTransport::~MamaTransport (void) { if (mPimpl) { if ( mamaInternal_getCatchCallbackExceptions() && mPimpl->mCallback) { delete mPimpl->mCallback; } if (mPimpl->mDeleteCTransport) { mamaTry (mamaTransport_destroy (mTransport)); } delete mPimpl; mPimpl = NULL; } }
Won’t this throw an exception and risk crashing if mamaTransport_destroy() fails? I can see similar code in other destructors, so I’m probably missing something.
Thanks,
--Richard
This e-mail (including any attachments) is confidential, may contain
proprietary or privileged information and is intended for the named
recipient(s) only. Unintended recipients are prohibited from taking action
on the basis of information in this e-mail and must delete all copies.
Nomura will not accept responsibility or liability for the accuracy or
completeness of, or the presence of any virus or disabling code in, this
e-mail. If verification is sought please request a hard copy. Any reference
to the terms of executed transactions should be treated as preliminary only
and subject to formal written confirmation by Nomura. Nomura reserves the
right to monitor e-mail communications through its networks (in accordance
with applicable laws). No confidentiality or privilege is waived or lost by
Nomura by any mistransmission of this e-mail. Any reference to "Nomura" is
a reference to any entity in the Nomura Holdings, Inc. group. Please read
our Electronic Communications Legal Notice which forms part of this e-mail:
http://www.Nomura.com/email_disclaimer.htm
|
|
Glenn McClements <gmcclements@...>
Hi Richard,
Yes, this is the right place for those kind of questions.
As a rule the mamaTry macro is called in the C++ wrapper before every call to the C layer, to translate the C return code to an exception on error conditions. However you are quite right in pointing out that this is dangerous practice in a destructor.
In reality, in existing MAMA deployments this hasn't been an issue as the mama<object>_destroy() functions can not generally fail when called from the C++ wrapper. As more third party bridges are developed for OpenMAMA however this may become an issue.
If you want to file a bug around this please do, at http://bugs.openmama.org
Even better, if you wish to submit a patch for it then details for patch submission are below are at
Glenn
From: <richard.furse@...>
Date: Tue, 13 Nov 2012 14:01:45 +0000 To: <Openmama-dev@...> Subject: [Openmama-dev] Throwing exceptions in destructors Hi there – I’m just taking a look through some of the OpenMAMA code and have a question. Is this the right place it?
The code I have (OpenMAMA 2.2.1.1) contains the following:
MamaTransport::~MamaTransport (void) { if (mPimpl) { if ( mamaInternal_getCatchCallbackExceptions() && mPimpl->mCallback) { delete mPimpl->mCallback; } if (mPimpl->mDeleteCTransport) { mamaTry (mamaTransport_destroy (mTransport)); } delete mPimpl; mPimpl = NULL; } }
Won’t this throw an exception and risk crashing if mamaTransport_destroy() fails? I can see similar code in other destructors, so I’m probably missing something.
Thanks,
--Richard
This e-mail (including any attachments) is confidential, may contain
proprietary or privileged information and is intended for the named
recipient(s) only. Unintended recipients are prohibited from taking action
on the basis of information in this e-mail and must delete all copies.
Nomura will not accept responsibility or liability for the accuracy or
completeness of, or the presence of any virus or disabling code in, this
e-mail. If verification is sought please request a hard copy. Any reference
to the terms of executed transactions should be treated as preliminary only
and subject to formal written confirmation by Nomura. Nomura reserves the
right to monitor e-mail communications through its networks (in accordance
with applicable laws). No confidentiality or privilege is waived or lost by
Nomura by any mistransmission of this e-mail. Any reference to "Nomura" is
a reference to any entity in the Nomura Holdings, Inc. group. Please read
our Electronic Communications Legal Notice which forms part of this e-mail:
Please consider the environment before printing this e-mail. This e-mail may contain confidential and/or privileged information. If you are not the intended recipient or have received this e-mail in error, please advise the sender immediately by reply e-mail and delete this message and any attachments without retaining a copy. Any unauthorised copying, disclosure or distribution of the material in this e-mail is strictly forbidden. |
|
richard.furse@...
Thanks!
I’m probably misreading the code, but won’t the MamaQueue destructor throw if there are any open events? This seems like a potentially common situation if there’s a stack unwind happening because of an exception thrown in other parts of the application, which is also a situation where a crash is more or less guaranteed on the second throw?
Best wishes,
--Richard
From: Glenn McClements [mailto:gmcclements@...]
Sent: 14 November 2012 17:57 To: Furse, Richard (EQ/UK) Cc: Openmama-dev@... Subject: Re: [Openmama-dev] Throwing exceptions in destructors
Hi Richard, Yes, this is the right place for those kind of questions.
As a rule the mamaTry macro is called in the C++ wrapper before every call to the C layer, to translate the C return code to an exception on error conditions. However you are quite right in pointing out that this is dangerous practice in a destructor.
In reality, in existing MAMA deployments this hasn't been an issue as the mama<object>_destroy() functions can not generally fail when called from the C++ wrapper. As more third party bridges are developed for OpenMAMA however this may become an issue.
If you want to file a bug around this please do, at http://bugs.openmama.org
Even better, if you wish to submit a patch for it then details for patch submission are below are at
Glenn
From: <richard.furse@...>
Hi there – I’m just taking a look through some of the OpenMAMA code and have a question. Is this the right place it?
The code I have (OpenMAMA 2.2.1.1) contains the following:
MamaTransport::~MamaTransport (void) { if (mPimpl) { if ( mamaInternal_getCatchCallbackExceptions() && mPimpl->mCallback) { delete mPimpl->mCallback; } if (mPimpl->mDeleteCTransport) { mamaTry (mamaTransport_destroy (mTransport)); } delete mPimpl; mPimpl = NULL; } }
Won’t this throw an exception and risk crashing if mamaTransport_destroy() fails? I can see similar code in other destructors, so I’m probably missing something.
Thanks,
--Richard
This e-mail (including any attachments) is confidential, may contain proprietary or privileged information and is intended for the named recipient(s) only. Unintended recipients are prohibited from taking action on the basis of information in this e-mail and must delete all copies. Nomura will not accept responsibility or liability for the accuracy or completeness of, or the presence of any virus or disabling code in, this e-mail. If verification is sought please request a hard copy. Any reference to the terms of executed transactions should be treated as preliminary only and subject to formal written confirmation by Nomura. Nomura reserves the right to monitor e-mail communications through its networks (in accordance with applicable laws). No confidentiality or privilege is waived or lost by Nomura by any mistransmission of this e-mail. Any reference to "Nomura" is a reference to any entity in the Nomura Holdings, Inc. group. Please read our Electronic Communications Legal Notice which forms part of this e-mail: _______________________________________________ Openmama-dev mailing list Openmama-dev@... https://lists.openmama.org/mailman/listinfo/openmama-dev
This e-mail (including any attachments) is confidential, may contain
proprietary or privileged information and is intended for the named
recipient(s) only. Unintended recipients are prohibited from taking action
on the basis of information in this e-mail and must delete all copies.
Nomura will not accept responsibility or liability for the accuracy or
completeness of, or the presence of any virus or disabling code in, this
e-mail. If verification is sought please request a hard copy. Any reference
to the terms of executed transactions should be treated as preliminary only
and subject to formal written confirmation by Nomura. Nomura reserves the
right to monitor e-mail communications through its networks (in accordance
with applicable laws). No confidentiality or privilege is waived or lost by
Nomura by any mistransmission of this e-mail. Any reference to "Nomura" is
a reference to any entity in the Nomura Holdings, Inc. group. Please read
our Electronic Communications Legal Notice which forms part of this e-mail:
http://www.Nomura.com/email_disclaimer.htm
|
|