You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Cliff Jansen (JIRA)" <ji...@apache.org> on 2010/11/02 18:08:29 UTC
[jira] Commented: (QPID-2923) Qpid Messaging .NET Binding fails to
translate exceptions from C++ to .NET
[ https://issues.apache.org/jira/browse/QPID-2923?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12927494#action_12927494 ]
Cliff Jansen commented on QPID-2923:
------------------------------------
> I think the beauty of using a member initialization list is overshadowed by the fact that the
> original version mishandles exceptions. I intend to replace all instances of the .NET
> binding's constructors with the same pattern.
+1
I am also in favor of uglifying any C++ code that reads nicely but fails to highlight managed to native transitions.
> Qpid Messaging .NET Binding fails to translate exceptions from C++ to .NET
> --------------------------------------------------------------------------
>
> Key: QPID-2923
> URL: https://issues.apache.org/jira/browse/QPID-2923
> Project: Qpid
> Issue Type: Bug
> Affects Versions: 0.7
> Environment: Windows
> Reporter: Chuck Rolke
> Assignee: Chuck Rolke
> Fix For: 0.7
>
>
> While adding the FailoverUpdate object a problem in the .NET Binding's scheme of error handling showed up. This issue will document the original problem and show a proposed coding pattern to make it better.
> Two versions of the FailoverUpdates constructor:
> *****************
> Original Version
> *****************
> FailoverUpdates::FailoverUpdates(Connection ^ connection) :
> failoverupdatesp(new ::qpid::messaging::FailoverUpdates(*(connection->NativeConnection)))
> {
> }
> This looks OK to me from a pure C++ standpoint. The problem comes from the environment in which this code runs. It is called by a managed C# or other .NET caller and it calls into the unmanaged C++ Qpid Messaging code. Using this code when the C++ code throws, the exception goes to a handler that does not understand what to do with it.
> A. If the user has no try-catch in the .NET calling code then a popup box shows:
> ---------------------------
> Microsoft Visual C++ Runtime Library
> ---------------------------
> Runtime Error!
> Program: ...\src\Debug\csharp.map.sender.vshost.exe
> This application has requested the Runtime to terminate it in an unusual way.
> Please contact the application's support team for more information.
> "in an unusual way"? What does that mean? This is not good.
> *****************
> Improved Version
> *****************
> FailoverUpdates::FailoverUpdates(Connection ^ connection)
> {
> System::Exception ^ newException = nullptr;
> try {
> failoverupdatesp = new ::qpid::messaging::FailoverUpdates(*(connection->NativeConnection));
> }
> catch (const ::qpid::types::Exception & error) {
> String ^ errmsg = gcnew String(error.what());
> newException = gcnew QpidException(errmsg);
> }
> if (newException != nullptr) {
> throw newException;
> }
> }
> The idea is to catch the exception from native C++ and rethrow it as a System::Exception.
> B. Now the user sees:
> An unhandled exception of type 'Org.Apache.Qpid.Messaging.QpidException'
> occurred in org.apache.qpid.messagingd.dll
> Additional information: Connection has not yet been opened
> (..\..\cpp\src\qpid\client\Connection.cpp:139)
> --------
> I think the beauty of using a member initialization list is overshadowed by the fact that the original version mishandles exceptions. I intend to replace all instances of the .NET binding's constructors with the same pattern.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:dev-subscribe@qpid.apache.org