2010-08-20 12 views
6

Tengo una aplicación C# que llama a una función en un dll C++. Esta función puede lanzar varias excepciones que hereda std::exception. Actualmente cojo estas excepciones como esto:¿Cómo obtengo una descripción de error std :: exception cuando llamo a un dll C++ desde C#

try 
{ 
    //Call to C++ dll 
} 
catch (System.Exception exception) 
{ 
    //Some error handling code 
} 

Mi primera pregunta es la voluntad de todo el código de captura std::exception? Mi segunda pregunta es cómo puedo recuperar la cadena std::exception::what, si examino exception.Message solo obtengo "El componente externo arrojó una excepción".

EDIT: La función en cuestión es de una manera no lograron DLL de C++, e importado como este en el clase C#:

[DllImport("SomeDLL.dll")] 
public extern static void SomeFunction(); 
+0

Hay un método ToString devuelve una representación de cadena de la excepción actual. http://msdn.microsoft.com/en-us/library/system.exception_members.aspx – DumbCoder

+2

http://stackoverflow.com/questions/150544/can-you-catch-a-native-exception-inc-c- code/150596 # 150596 – celavek

Respuesta

0

llamada, ¿cómo? El CLR realmente no "obtiene" el manejo de excepciones de C++. Si llama al código C++ a través de COM, agregue una capa que atrape la excepción std :: y envuélvala con HRESULT/IErrorInfo. Si lo llama a través de C++ administrado, agregue una capa que lo envuelva en una excepción System.Exception administrada

+0

He actualizado mi pregunta –

+1

El mismo principio se aplica a PInvoke. Es más fácil encontrar algún otro protocolo para reportar errores. Usando los valores de retorno, los parámetros de salida y/o la función SetLastError de Windows, por ejemplo. –

0

La mejor manera de hacerlo sería manejar la excepción en C++ y guardar el mensaje de error en alguna parte. Luego, en C# puede verificar si se guardó un mensaje de error, y si fue así puede recuperarlo.

C++:

try 
{ 
    //do some processing 
} 
catch(std::exception& ex) 
{ 
    // errorMessage can be a std::string 
    errorMessage = ex.what(); 
} 

C#:

[DllImport("SomeDLL.dll")] 
public extern static void SomeFunction(); 
[DllImport("SomeDLL.dll")] 
public extern static string GetError(); 

SomeFunction(); 
string Error = GetError(); 
if(String.IsNullOrEmpty(Error)==true) 
{ 
    //The processing was successfull 
} 
else 
{ 
    //The processing was unsuccessful 
    MessageBox.Show(Error); 
} 
+0

¿Y si es un código de un tercero, no tengo posibilidad de modificarlo? – qub1n

Cuestiones relacionadas