2011-07-15 13 views
6

Estoy usando una aplicación de terceros mal escrita (C/C++). Lo usé desde código administrado (C++/CLI). Obtenga a veces "errores de violación de acceso". Y esta aplicación completa falla. Sé que no puedo manejar esos errores [qué puedo hacer si un puntero accede a una ubicación de memoria ilegal, etc.].Manejo de errores al usar código no administrado en uno administrado (C++, C, C++/CLI, C#)

Pero no quiero que la aplicación se cuelgue en su totalidad. Al menos si hay un problema real, mi aplicación correctamente debería decir "OK". No puedo hacer mi trabajo. BYE. ":-) luego ejecutará por lo menos una alternativa alternativa y finalmente se cerrará.

Pero parece que no hay forma de detectar (puede ser un término incorrecto, la palabra correcta puede ser informada) violación de acceso y errores similares. Hay una forma de estar informado acerca de esos errores. Entonces puedo ejecutar mi alternativa de manera espectacular.

PD: El manejo de excepciones estándar no resuelve esto.

#include "stdafx.h" 
#include <iostream> 

using namespace System; 

using namespace std; 


static void ThrowingManagedException() 
{ 

    throw gcnew ArgumentException("For no good reason"); 

} 

static void ThrowingNativeException() 
{ 

    throw std::exception("For no good reason"); 



} 

static void SomeBadThingsHappen() 
{ 

    short a[1]; 

    a[0]=1; 

    a[2]= 2; // SomeOne make stupid mistake 

} 

int main(array<System::String ^> ^args) 
{ 
    Console::WriteLine(L"Test Exceptions"); 

    try 
    { 

     SomeBadThingsHappen(); 
     //ThrowingNativeException();   
     //ThrowingManagedException(); 
    } 


    catch(Exception^ e) 
    { 
     Console::WriteLine("Something awful happened: "+ e); 
    } 


    Console::WriteLine("Press enter to exit"); 
    Console::Read(); 

    return 0; 
} 
+0

Si estoy en lo correcto, ¿no P/Invocará "convertir" errores no administrados en excepciones administradas que pueda detectar? –

+2

@SimpleCoder: Sí, pero no va a deshacer el daño causado por punteros salvajes. –

+0

Es realmente simple. Si tiene punteros malos, no hay una forma realmente buena de manejar ese problema. Supongamos que la biblioteca es un programa en sí, todo lo que sucedería es que el programa se bloquee, esto es similar a la "Excepción de OutOfMemory" donde simplemente no hay forma de recuperarse de ella. –

Respuesta

4

Si está seguro de que los problemas son los errores en la biblioteca, y no el resultado de que pasa en los malos argumentos, a continuación, la opción más robusta es la comunicación entre procesos con un proceso de alojamiento que carga la biblioteca . De esta forma, la separación de procesos del sistema operativo evita que la biblioteca reduzca su aplicación.

Puede intentar detectar violaciones de acceso en el proceso, utilizando SEH, pero si la biblioteca escribe en punteros desenfrenados y no en simples punteros nulos, entonces el proceso no sobrevivirá incluso con un controlador de excepción.

Su ejemplo no provocará una violación de acceso, es un desbordamiento de búfer de un búfer en la pila, por lo que la ubicación de memoria adyacente contiene algunos otros datos válidos que se pisotean.

+0

La violación de acceso es solo un ejemplo. En general me refiero a errores que no son cautos por el manejo de excepciones estándar. – Novalis

Cuestiones relacionadas