Ho un problema nell'usare un componente di terze parti in Delphi 2006 (anche Delphi 7), in cui viene visualizzato un "Errore non specificato" quando si esegue una chiamata di funzione a quel componente. Hai un codice di esempio che utilizza GetLastError e FormatMessage in Delphi, che mi consentirebbe di accedere a più informazioni sull'errore? TIA :)Qual è l'uso corretto di GetLastError e FormatMessage in Delphi?
risposta
C'è una funzione di supporto integrata in Delphi: SysErrorMessage
. È essenzialmente un wrapper per FormatMessage
, ma molto più semplice da utilizzare nel tuo caso. Basta fornire il codice di errore per il quale è necessaria una descrizione testuale.
Per esempio si può usare questo per visualizzare l'ultimo errore:
ShowMessage(SysErrorMessage(GetLastError))
Se si vuole sollevare un'eccezione con questo messaggio, è ancora più semplice:
RaiseLastOSError;
Importante: Fare sicuro che non ci sia una chiamata API aggiuntiva tra la funzione malfunzionante e la vostra chiamata di GetLastError
, altrimenti l'ultimo errore verrà ripristinato.
Mentre DR è corretto, c'è un problema con questo approccio: non consente di specificare il contesto in cui si è verificato l'errore. Mai visto l'errore "Una funzione API fallita." senza essere più saggio quale funzione fosse e dove si è verificato?
Ecco perché ho scritto le RaiseLastOsErrorEx e Win32CheckEx funzioni:
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;
(Fanno parte di u_dzMiscUtils unità della mia biblioteca dzLib disponibile qui: https://sourceforge.net/p/dzlib/code/HEAD/tree/dzlib/trunk/src/u_dzOsUtils.pas
Grazie mille per il codice aggiuntivo e i collegamenti :) +1 –
Un framework di eccezioni generali come madExcept sarebbe ancora meglio. –
@DR: Sì, forse, ma non era questa la domanda. – dummzeuch
- 1. Application_Error - GetLastError() o GetLastError(). GetBaseException()
- 2. Errori in Windows - DWORD (GetLastError) vs HRESULT vs LSTATUS
- 3. Qual è l'uso corretto di res.render() e res.redirect() in Express?
- 4. - Qual è l'approccio corretto?
- 5. Delphi - Qual è l'ordine "corretto" per i blocchi eccetto e infine?
- 6. Qual è il modo corretto di avviare un thread sospeso in Delphi 2007?
- 7. Qual è la differenza tra AsInteger e Value in Delphi?
- 8. CreateFile() restituisce INVALID_HANDLE_VALUE ma GetLastError() è ERROR_SUCCESS
- 9. Quando si utilizza SetLength() in Delphi, qual è il modo corretto per deallocare quella memoria?
- 10. Qual è il modo corretto di QSqlDatabase e QSqlQuery?
- 11. Qual è l'uso corretto di ConfirmChildControls()?
- 12. Qual è l'uso corretto di ConcurrentBag?
- 13. Qual è il modo corretto di usare Toolbar e SwipeRefreshLayout?
- 14. Qual è il modo corretto di reindirizzare?
- 15. WSAGetLastError() è solo un alias per GetLastError()?
- 16. Qual è l'uso corretto di schema.org SiteNavigationElement?
- 17. Qual è il valore corretto di `$?` In una pipeline?
- 18. Qual è il formato di valuta corretto in olandese belga?
- 19. Cerca e sostituisci: qual è il collegamento corretto?
- 20. Qual è il comportamento corretto di endIndex dell'array in Swift?
- 21. Qual è un modo corretto e valido per implementare __hash __()?
- 22. Qual è il modo corretto di rientrare in Erlang?
- 23. Qual è il modo corretto di aggiornare ContentItem in Orchard?
- 24. Qual è il modo corretto di usare strongSelf in swift?
- 25. Qual è l'uso corretto di XmlNode.SelectSingleNode (stringa xpath) in C#?
- 26. CSS background-image - Qual è l'uso corretto?
- 27. qual è il modo 'corretto' di utilizzare objectWithID di NSManagedObjectContext:
- 28. Qual è il modo corretto di usare projection.stream() di D3?
- 29. Qual è il modo corretto in cui pubblicare le gemme?
- 30. Qual è il significato delle direttive di reintroduzione e override in Delphi?
Sta arrivando, sta arrivando :) –
Nota: L'utilizzo di una stringa di risorse comporterà una chiamata API, quindi perderai il codice di errore! – dummzeuch