try catch delphi winapi error-handling

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.