Quienes han usado directamente la API de Windows tendrán muy presente que esta no suele elevar excepciones al ocurrir una situación de error. En lugar de eso, la API de Windows establece un código de error numérico que podemos recuperar con la función
GetLastError. A veces es necesario convertir este código de error a algo que sea relativamente comprensible para el usuario de la aplicación (aunque más útil para el programador que recibirá el reporte del usuario), y para ello Delphi cuenta con la función SysErrorMessage, la cual envuelve a la función FormatMessage del sistema operativo.
También es común que, una vez obtenido el texto del error, queramos elevar una excepción Delphi con él. Así ocurre por ejemplo en
este caso:
Código Delphi
[-]else
raise Exception.Create(SysErrorMessage(GetLastError));
Con GHF, para obtener el texto del error, podemos usar la función
ghLastErrorMsg:
Código Delphi
[-]else
raise Exception.Create (ghLastErrorMsg);
Pero podemos simplificar un poco más toda la sentencia usando la función
ghRaiseLastError:
Internamente, esta función llama a ghLastErrorMsg y eleva una excepción con el texto del error. Además, ghRaiseLastError admite un parámetro opcional de tipo String para indicar el formato a dar al mensaje de error. Si no se especifica el formato, se utiliza el predeterminado '%s (GetLastError %d).', viéndose el mensaje de excepción como en este ejemplo:
El formato se aplica con la función estándar Format que todos conocemos. "%s" indica en qué parte del mensaje de excepción debe ghRaiseLastError poner el texto del error devuelto por ghLastErrorMsg. "%d" significa que en esa posición debe aparecer el código de error numérico que arrojó GetLastError. Cualquiera de los dos comodines puede ser omitido, por lo que el formato de la excepción es totalmente flexible. Sólo considerar que en la llamada interna a Format, el texto del error es el primer parámetro y el código numérico el segundo. Otro ejemplo:
Código Delphi
[-]ghRaiseLastError ('No fue posible realizar la operación.'#13#10 +
'Error interno %1:d (%0:s).');
Resultado:
Posteriormente agregaré la documentación detallada de estas dos funciones al
manual de referencia.
Un saludo.
Al González.