2010-05-18 5 views
5

Al escribir el código Win32 C++, agradecería algunos consejos sobre cómo manejar los errores de las API Win32.Sugerencias sobre el manejo de errores del código Win32 C++: excepciones de AtlThrow vs. STL

En particular, en caso de un fallo de una llamada a la función Win32 (por ejemplo MapViewOfFile), es mejor a:

  1. uso AtlThrowLastWin32

  2. definir un clase Win32Exception derivado de std :: exception, con un miembro de datos HRESULT agregado para almacenar HRESULT correspondiente al valor devuelto por GetLastError?

En este último caso, podría usar el método de lo que() para devolver una cadena de error detallado (por ejemplo, "llamada MapViewOfFile falló en MyClass :: HacerAlgo() método.").

¿Cuáles son los pros y los contras de 1 vs. 2?

¿Hay alguna otra opción mejor que me falta?

Como nota al margen, si me gustaría localizar el componente que estoy desarrollando, ¿cómo podría localizar la cadena de excepción what()? Estaba pensando en construir una tabla mapeando la cadena original en inglés devuelta por what() en una cadena de error localizado de Unicode. ¿Alguien podría sugerir un mejor enfoque?

Muchas gracias por sus ideas y sugerencias.

Respuesta

5

AtlThrow no es terriblemente útil, arroja CAtlException que simplemente envuelve un código de error. Hacer que MapViewOfFile falle es un problema verdaderamente excepcional con un código de error de bajo nivel que no le dice a usted ni a su usuario mucho de lo que realmente salió mal. Manejar el error casi siempre es imposible, no es probable que puedas ignorarlo y simplemente no usar un archivo MMF. Deberá registrar el error y finalizar su programa con un error muy genérico.

Obtener mucho detalle en su mensaje de error suele ser un esfuerzo desperdiciado. "La llamada MapViewOfFile falló en el método MyClass :: DoSomething()" simplemente no significa nada en absoluto para su usuario o su personal de soporte. Genial para ti, algo para rastrear el error. Pero puede automatizar fácilmente esto, sin problemas de localización, utilizando las macros __FILE__ y __LINE__. Todo lo que necesitas para unir el error con el código fuente.

Mantenga el mensaje de error corto y ágil. Para los errores de Windows, querrá usar FormatMessage() para permitir que Windows genere el mensaje. Se localizará automáticamente, el texto del mensaje está estandarizado y funciona bien. Derivar de std :: exception está bien. Use ID de recurso de cadena para mensajes personalizados para que pueda localizarlos fácilmente. Resuelve el problema what() también.

Cuestiones relacionadas