You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Chuck Rolke (JIRA)" <ji...@apache.org> on 2010/11/02 17:14:25 UTC

[jira] Created: (QPID-2923) Qpid Messaging .NET Binding fails to translate exceptions from C++ to .NET

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


[jira] Resolved: (QPID-2923) Qpid Messaging .NET Binding fails to translate exceptions from C++ to .NET

Posted by "Chuck Rolke (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/QPID-2923?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Chuck Rolke resolved QPID-2923.
-------------------------------

    Resolution: Fixed

> 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


[jira] Commented: (QPID-2923) Qpid Messaging .NET Binding fails to translate exceptions from C++ to .NET

Posted by "Cliff Jansen (JIRA)" <ji...@apache.org>.
    [ 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