![]() |
Tratamiento de errores entorno al API de Windows
Hola,
¿Qué tal va eso? Espero que bien. :) Veréis. Tengo un problema. Resulta que cuando uno trabaja con componentes y ejecuta sus métodos y tal, bueno, el tratamiento de errores suele consistir en estar al tanto de las excepciones que puedan producirse. Ahora bien, cuando uno trata con el API de Windows directamente, me parece que no pueden esperarse excepciones, sino "errores del sistema", que no pueden capturarse, por tanto, como si fueran excepciones. Pondré un ejemplo. Si uno ejecuta la función "ShFileOperation" para borrar un archivo, por ejemplo, obtendrá un error del sistema si el archivo a borrar no existe. Pero no vale de nada (parece ser) hacer algo como:
Porque, sencillamente, no es posible capturar ninguna excepción... pero el sistema sí advierte del error, y no sólo lo hace retornando un valor distinto de cero con la función susomentada, pero muestra un mensaje de error... que no queda muy curioso, porque además es de los típicos crípticos que muestra Windows... Hombre. Se entiende que algo ha ido mal. Incluso llega a comprenderse por el mensaje de error (después de darle la vuelta a las palabras) que lo que ocurre es que no puede borrarse un archivo que no existe, pero, ¿hay alguna forma de evitar este mensaje error? Obviamente no de evitarlo "como si no hubiera pasado nada", sino evitarlo en el sentido de hacérselo llegar al usuario por otros medios, en alguna variable, por ejemplo, no mediante un mensaje que uno no controla... Así que me pregunto cómo pueden tratarse este tipo de errores, para los cuales no existen excepciones. Conozco funciones como "GetLastError", pero, no me queda muy claro su uso. De hecho siguiendo con el ejemplo, trato de "capturar" el error mediante esta función, pero, no lo consigo... A ver si me podéis echar una mano monstruos, y bueno, a todo aquél que como yo está perdido en este asunto. Gracias de antemano pataliebres. Buenos días, buenas tardes o buenas noches, dependiendo de donde estén vuecencias. :D :D |
|
Hola,
Te agradezco el enlace egostar. Curiosamente, el autor del código visto estaría en las mismas que yo, puesto que escribe algo muy similar a lo que yo mismo escribo: Código:
iSHerr = SHFileOperation (&shfos); Código:
wsprintf (szDebug, "SHFO gave error %d", GetLastError()); Y añadiré algo más aún... haciendo algo más o menos así:
Si no existe la carpeta a borrar (suponiendo que esto es lo que vamos a hacer), efectivamente, se ejecuta el "else" del código de más arriba, pero, ¡el mensaje que obtengo de "SysErrorMessage" es "La operación se completó correctamente"... O sea... definitivamente algo se me escapa en todo esto. Pero gracias egostar, verás como al final sacamos algo en claro entre todos. :) |
Cita:
|
Hola,
Cita:
Voy a probar esa "bandera". Gracias otra vez Seoane. :) |
Yo lo veo difícil. Imagina que tú haces una dll con una función HazEsto que hace esto:
A lo que voy es: como no provea la misma api de esa función, un mecanismo para omitir los mensajes de error, no veo por donde pueda evitarse. Bueno, yo supongo que seoane puede inyectar un código a shellapi, pero habrá que esperar a que lea esto. // Saludos |
Hola,
Gracias Seoane. Funciona estupendamente la bandera "FOF_NOERRORUI". :) Ya no muestra el mensaje de error del sistema. Peeeeeeeeeero... sigo obteniendo como "último error" un "Operación completada correctamente"... aunque ahora mismo ya no sé muy bien qué pensar de esto, puesto que estoy un poco eufórico tras haber solucionado en buena medida el asunto con la banderita de marras. :) |
Ja, ja, juro que no había las dos respuestas anteriores cuando escribí la mía. Pero ya veo que sí se provee el mecanismo que mencioné.
// Saludos |
Hola,
Sí; los tiros van por donde apuntas Román. Se ve que la función de marras del API de Windows muestra el mensaje de error... a no ser que se indique (véase más arriba) específicamente que no muestre mensajes de error. :) |
Al parecer GetLastError siempre regresará cero. No obstante ShFileOperation devuelve un valor distinto de cero en caso de error. De ahí puedes partir.
// Saludos |
Hola,
De ahí parto Román... o es la intención: como "ShFileOperation" retorna "no cero"... busco el error con "GetLastError", pero, no parece estar ahí. |
Pues a mi lo que me preocupa es que hace esta instruccion:
Fíjate que la instrucción GetLastError no solo muestra el ultimo error, sino el ultimo resultado de una operación de la api. Así que si dentro de esa rutina se llama, aunque solo sea indirectamente, a una API, GetLastError nos estaría devolviendo ese resultado y no el error que nos interesa. |
Hola,
Sí; comprendo lo que dices Seoane. Había pensado en ello... y bueno, tal vez sea por eso que "SysErrorMessage(GetLastError())" retorna "La operación se completó correctamente". Voy a probar el asunto de modo que nada más se ejecute luego de "ShFileOperation" y cuento el resultado. :) |
Hola,
Nope... algo como esto:
Sigue retornando en "SysErrorMessage(GetLastError())" "La operación se ha completado correctamente", incluso cuando no es así, es decir, "ShFileOperation" retornó algo distinto de cero, puesto que "la carpeta a borrar" no existe... PD. Estoy ahora investigando sobre la función "Win32Check", porque lo que dice la ayuda parece muy interesante... |
Fijate lo que cuenta microsoft :D
Cita:
PD: Si es que no leemos la ayuda :p :D El enlace: http://msdn2.microsoft.com/en-us/library/ms647743.aspx |
Hola,
Je, je, je... Sí. No sé si he dicho antes que la función "ShFileOperation" es mucha función... que necesito leer la ayuda, vamos. :) Sin embargo... parece que en este caso "Win32Check" puede ayudarnos. Resulta que esta función "comprueba" que la instrucción que encierra se ejecuta correctamente, y, cuando no es así, se levanta una excepción. En el caso que nos ocupa es una excepción del tipo "EOSError", con el mensaje "manejador inválido" (no existe la carpeta, será). Bueno. Estupendo... creo que hoy he aprendido gracias a todos algo que no sabía.
Gracias a todos pataliebres. :D :D :D |
Cita:
Cita:
Salud OS. |
Hola,
Gracias egostar. Me quedo con todo, pero, particularmente con esto: Cita:
Gracias otra vez a todos. |
Hola,
O sea:
Má o meno.... :D |
No entiendo porque usar Win32Check. Esa función solo crea una excepción cuando el valor que le pasas no es TRUE, siempre el mismo tipo de excepción. Si es eso lo que quieres, perfecto, pero no creo que te haga falta.
|
La franja horaria es GMT +2. Ahora son las 21:09:25. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi