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;
}
Si estoy en lo correcto, ¿no P/Invocará "convertir" errores no administrados en excepciones administradas que pueda detectar? –
@SimpleCoder: Sí, pero no va a deshacer el daño causado por punteros salvajes. –
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. –