visual una try tipos sharp que practicas personalizadas manejo existen excepción excepciones ejemplos catch buenas .net exception error-handling c++-cli

.net - una - que tipos de excepciones existen en c#



Práctica recomendada para traducir excepciones en la clase contenedora C++/CLI (4)

Estoy escribiendo una clase .NET wrapper para una clase nativa existente que arroja excepciones. ¿Cuáles son las mejores prácticas para traducir entre excepciones nativas de C ++ y excepciones administradas? Capture y vuelva a lanzar en una base de uno a uno (por ejemplo, std :: invalid_argument -> System.System.ArgumentException)? ¿Hay algún mapeo ya preparado en alguna parte?


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


No hay un mapeo estándar que yo sepa. Lo que hice en el pasado es traducir los que conozco, y un bloque catch para System.Runtime.InteropServices.SEHException. Todas las excepciones no traducidas se convertirán en esa excepción. Siempre que tengas una compilación de depuración del código que arroje la excepción, deberías obtener un buen seguimiento de la pila. Luego puede ir a ver la excepción y escribir el contenedor.

Pero en el último proyecto en el que tuve que hacer esto, fui con algo mucho más simple, terminé escribiendo un par de derivadas 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 forma, no "perdí" lo que se estaba lanzando desde C ++, pero no tuve que mapear todo excepto los más importantes.


¿Qué estás realmente tratando de hacer?

Interop ya traduce las excepciones nativas a las administradas, incluidas las excepciones SEH. Sin embargo, un buen diseño exige que TODAS las excepciones se capturen en el nivel de API nativo. No deberías desviarse de esto a menos que haya una buena razón. No sabemos lo suficiente sobre su diseño.


El mapeo uno a uno me parece el enfoque más sensato. La asignación "universal" es difícilmente posible debido a excepciones específicas de la aplicación, aunque hay algunas asignaciones obvias para las clases de excepción STL.

También hay un problema de excepciones SEH del código no administrado. Dependiendo de su situación, podría ser necesario atraparlos y envolverlos también.