catch - ¿Cuál es el uso correcto de GetLastError y FormatMessage en Delphi?
on except delphi (2)
Si bien DR es correcto, hay un problema con este enfoque: no le permite especificar el contexto en el que ocurrió el error. Alguna vez has visto el error "Falló una función API". sin ser más sabio de qué función era y dónde sucedió?
Es por eso que escribí las funciones RaiseLastOsErrorEx y Win32CheckEx:
procedure RaiseLastOsErrorEx(const _Format: string);
begin
RaiseLastOsErrorEx(GetLastError, _Format);
end;
procedure RaiseLastOsErrorEx(_ErrorCode: integer; _Format: string); overload;
var
Error: EOSError;
begin
if _ErrorCode <> ERROR_SUCCESS then
Error := EOSError.CreateFmt(_Format, [_ErrorCode, SysErrorMessage(_ErrorCode)])
else
Error := EOsError.CreateFmt(_Format, [_ErrorCode, _(''unknown OS error'')]);
Error.ErrorCode := _ErrorCode;
raise Error;
end;
function GetLastOsError(out _Error: string; const _Format: string = ''''): DWORD;
begin
Result := GetLastOsError(GetLastError, _Error, _Format);
end;
function GetLastOsError(_ErrCode: integer; out _Error: string; const _Format: string = ''''): DWORD;
var
s: string;
begin
Result := _ErrCode;
if Result <> ERROR_SUCCESS then
s := SysErrorMessage(Result)
else
s := _(''unknown OS error'');
if _Format <> '''' then
try
_Error := Format(_Format, [Result, s])
except
_Error := s;
end else
_Error := s;
end;
function Win32CheckEx(_RetVal: BOOL; out _ErrorCode: DWORD; out _Error: string;
const _Format: string = ''''): BOOL;
begin
Result := _RetVal;
if not Result then
_ErrorCode := GetLastOsError(_Error, _Format);
end;
(Forman parte de la unidad u_dzMiscUtils de mi biblioteca dzLib disponible aquí: https://sourceforge.net/p/dzlib/code/HEAD/tree/dzlib/trunk/src/u_dzOsUtils.pas
Tengo un problema al usar un componente de terceros en Delphi 2006 (también Delphi 7), en el que obtengo un "Error no especificado" al ejecutar una llamada de función a ese componente. ¿Tiene un código de ejemplo que utiliza GetLastError y FormatMessage en Delphi, que me permitiría acceder a más información sobre el error? TIA :)
Hay una función de ayuda integrada en Delphi: SysErrorMessage
. Es esencialmente un contenedor para FormatMessage
, pero mucho más simple de usar en su caso. Simplemente proporcione el código de error para el que necesita una descripción textual.
Por ejemplo, puede usar esto para mostrar el último error:
ShowMessage(SysErrorMessage(GetLastError))
Si desea plantear una excepción con este mensaje, es aún más simple:
RaiseLastOSError;
Importante : asegúrese de que no haya una llamada API adicional entre la función GetLastError
y su llamada a GetLastError
; de lo contrario, se restablecerá el último error.