2011-11-01 11 views
5

Algunas funciones de Windows como CreateFile podría volver una variedad enorme de códigos de error cuando GetLastError se llama, y ​​es poco práctica para comprobar si todos los códigos de error posible - a menudo no hay suficiente documentación y nuevos códigos de error se añaden con frecuencia.¿Qué errores debo manejar? ¿Cuáles son "fatales"?

Algunos de ellos (como infracciones de acceso o parámetros no válidos) se deben a un error del programador y no deberían permitir la continuación de la ejecución del programa. Sin embargo, otros se deben a otros factores, como permisos de archivos incorrectos, violaciones de uso compartido, nombres de archivos incorrectos, etc., sobre los cuales el desarrollador tiene poco o ningún control.

Me gustaría manejar todos los errores "no críticos" (como los nombres de archivos incorrectos), al tiempo que permite que los "errores críticos" (como las violaciones de acceso) bloqueen mi programa.

Idealmente, me estaría diciendo:

// ... an error occurred. Is it a programmer error? 

if (IsErrorCritical(GetLastError())) 
{ 
    // Yes; raise an exception, crashing the program. 
    RaiseException(GetLastError(), 0, 0, NULL); 
} 

¿Cómo decidir qué códigos de error son seguros para suprimir (por ejemplo, cuando se enumeran los archivos en un disco), cuando no puedo posiblemente predecir cada uno de los resultados ?

+2

Argumentaría que un programa nunca debe fallar excepto en circunstancias verdaderamente excepcionales (violación de acceso, etc.). No crear un archivo debe ser una falla esperada y debe manejarse de manera elegante. Además, tan pronto como se agregue un nuevo código de error, su función IsErrorCritical() quedaría desactualizada. – Luke

+0

Correcto, pero ¿cómo sé si algo es "realmente excepcional"? Esa es la pregunta ... – Mehrdad

+0

Cuando digo excepcional me refiero exactamente a eso. Las violaciones de acceso y la falta de memoria son las dos más importantes; puede haber otros, pero entiendes la idea. Si la falla de CreateFile() hace que tu programa se cuelgue, entonces lo estás haciendo mal en mi humilde opinión. – Luke

Respuesta

3

Creo que realmente depende del contexto, es imposible en general decidir esto, sino que debe decidirse caso por caso.

La razón por la que digo esto es porque a veces el mismo código de error viene en diferentes contextos, por lo que no es el código de error el que puede usarse para determinar si es crítico, sino el contexto mismo.

4

"Crítico" depende de lo que esté haciendo con el archivo.

Cualquier código de error podría deberse a un error del programador o a algo excepcional en la máquina en ejecución; No creo que sea una distinción importante en el manejo de errores.

Para los errores que no maneja específicamente (los "desconocidos"), simplemente suponga que el archivo no fue creado, y maneje ese caso. No importa POR QUÉ no fue creado, solo asuma que no fue así y tenga en cuenta ese escenario. Dependiendo de lo que esté haciendo su código y la cantidad de esfuerzo que desea poner en este escenario, puede ser fatal o no.

Tenga en cuenta que las violaciones de acceso no son algo que GetLastError() conoce, por lo que no entiendo su relevancia para su pregunta.

+0

En realidad, * he * recuperado las violaciones de acceso de 'GetLastError'. No con 'CreateFile' por supuesto, pero desde otras funciones (no recuerdo cuáles, desafortunadamente). Pero buen punto de todos modos, +1. – Mehrdad

+0

¿Qué significa "recuperar una violación de acceso de getlasterror"? – tenfour

+0

Significa que he recibido 'ERROR_NOACCESS' devuelto por GetLastError, pero no recuerdo para qué función lo obtuve. – Mehrdad

Cuestiones relacionadas