Pregunta

Estoy escribiendo una clase contenedora .NET para una clase nativa existente que genera excepciones.¿Cuáles son las mejores prácticas para traducir entre excepciones nativas de C++ y excepciones administradas?Atrapar y volver a lanzar uno a uno (p. ej.std::invalid_argument -> System.System.ArgumentException)?¿Existe ya un mapeo elaborado en alguna parte?

¿Fue útil?

Solución

No existe ningún mapeo estándar que yo sepa.Lo que hice en el pasado fue traducir los que conozco y un bloque de captura para System.Runtime.InteropServices.SEHException.Todas las excepciones no traducidas se convertirán en esa excepción.Siempre que tenga una compilación de depuración del código que genera la excepción, debería obtener un buen seguimiento de la pila.Luego puedes mirar la excepción y escribir el contenedor.

Pero en el último proyecto en el que tuve que hacer esto, opté por algo mucho más simple, terminé escribiendo un par de derivados de System.Exception para logic_error y runtime_error.Luego capturaría esas 2 clases base y usaría typeid(err) para escribir el mensaje .NET que se lanzó.De esta manera no "perdí" lo que se lanzaba desde C++ pero no tuve que mapear todo excepto los más importantes.

Otros consejos

El mapeo uno a uno me parece el enfoque más sensato.El mapeo "universal" es casi imposible debido a excepciones específicas de la aplicación, aunque existe un mapeo obvio para las clases de excepción STL.

También existe un problema con las excepciones SEH del código no administrado.Dependiendo de su situación, puede que también sea necesario atraparlos y envolverlos.

Creo que depende del diseño del envoltorio.Si la interfaz del contenedor del administrador será casi idéntica a la interfaz de la biblioteca no administrada, vuelva a generar las excepciones 1:1.Si está cambiando la interfaz de manera significativa, inicie las excepciones más apropiadas para la nueva interfaz.De cualquier manera, asegúrese de que el contenedor genere excepciones cada vez que no se pueda completar una operación para que sea coherente con las pautas de diseño de .NET.

¿Qué estás tratando de hacer realmente?

Interop ya traduce las excepciones nativas a administradas, incluidas las excepciones SEH.Sin embargo, un buen diseño exige que TODO las excepciones deben detectarse en el nivel de API nativa.No debes desviarte de esto a menos que haya una buena razón.No sabemos lo suficiente sobre su diseño.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top