Estrategias para controlar errores en COM+
En este tema se describen varias estrategias de gestión de errores que deben tenerse en cuenta al desarrollar componentes para COM+.
Devuelve un valor HRESULT para todos los métodos de todas las interfaces de componentes. COM+ usa valores HRESULT para informar sobre los errores al realizar llamadas de función o llamadas a métodos de interfaz. Un HRESULT indica si un método ha tenido éxito o no e identifica la instalación asociada con el error, como RPC, WIN32 o ITF para errores específicos de interfaz. Además, las API del sistema proporcionan una búsqueda desde un HRESULT a una cadena que describe la condición de error. El uso de métodos que devuelven valores HRESULT es fundamental para los componentes bien escritos y son esenciales para el proceso de depuración. Microsoft Visual Basic define automáticamente cada método con un HRESULT como devolución. En Microsoft Visual C++, debe devolver explícitamente un HRESULT. Para obtener información adicional sobre HRESULT, consulte Estructura de los códigos de error COM.
Inicie el objeto de colección ErrorInfo por cualquier medio que le proporcione su herramienta de desarrollo. Los objetos de colección ErrorInfo a menudo se denominan excepciones COM porque permiten que un objeto pase (o lance) información de error enriquecida a su autor de la llamada, incluso a través de los límites de los departamentos. El valor de este objeto de error genérico es que complementa a un HRESULT, ampliando el tipo de información de error que se puede devolver a una persona que llama. Cada objeto de colección ErrorInfo devuelve una descripción contextual, el origen del error y el identificador de interfaz del método que originó el error. También puede incluir punteros a una entrada en un archivo de ayuda. Automation proporciona tres interfaces para administrar el objeto de error. El componente debe implementar la interfaz ISupportErrorInfo de Automation para anunciar su compatibilidad con la colección ErrorInfo. Cuando se produce un error, el componente usa la interfaz ICreateErrorInfo de Automation para inicializar un objeto de error. Una vez que el autor de la llamada inspecciona HRESULT y detecta que se ha producido un error en la llamada al método, consulta el objeto para ver si admite la colección ErrorInfo. Si es así, el autor de la llamada usa la interfaz IErrorInfo de Automation para recuperar la información de error. Los programadores de Visual Basic tienen fácil acceso al objeto de colección ErrorInfo , que se expone a través del objeto Err. Puede generar errores con la función Err Raise y detectar errores con la instrucción On Error. La capa de ejecución de Visual Basic se encarga de la asignación automáticamente. Si está usando el soporte del compilador COM de Visual C++, puede usar la clase _com_raise_error para informar de un error y la clase _com_error para recuperar la información del error. COM+ no propagará excepciones tradicionales de C++ como información extendida de IErrorInfo. Para obtener más información sobre el objeto de colección ErrorInfo, consulte "Control de errores" en la guía de Automation.
Nota:
COM requiere que todos los objetos de la colección ErrorInfo serialicen por valor, lo que implica que los componentes que implementan la interfaz de automatización IErrorInfo de Automation también deben implementar y soportar la interfaz IMarshal. La implementación de la interfaz IMarshal debe admitir serializaciones por valor para el componente.
Use transacciones para administrar errores de recursos compartidos. Las transacciones automáticas pueden reducir significativamente la cantidad de código de control de errores que debe escribir al usar administradores de recursos administrados por estado. Sin embargo, las transacciones no eliminan por completo la necesidad de gestionar los errores. Todavía necesita devolver códigos de error de sus métodos de interfaz y comprobar esos códigos de error dentro del autor de la llamada para evitar hacer trabajo innecesario para una transacción condenada. Para obtener más información sobre cómo combinar el control de errores con el procesamiento de transacciones, consulte Acelerar las transacciones notificando al objeto raíz.
Genere errores explícitamente. Evite que la información de error salga de un objeto a menos que el objeto genere explícitamente el error. Capture todos los errores generados por la herramienta y gestiónelos en el código de su componente. Como mínimo, incluya un gestor estándar para informar de errores inesperados de forma coherente.
Use el rango de errores FACILITY_ITF para notificar errores específicos de la interfaz. Los errores específicos de interfaz deben estar en el rango de errores FACILITY_ITF, entre 0x0200 y 0xFFFF. Puede definir un código de error personalizado en Visual Basic como un desplazamiento de vbObjectError. Use la macro MAKE_HRESULT en C++ para especificar un código de error específico de la interfaz, como se muestra en el siguiente ejemplo:
const HRESULT ERROR_NUMBER = MAKE_HRESULT (SEVERITY_ERROR, FACILITY_ITF, 10);
Temas relacionados