Delphi-Version: 7
wie geht man richtig mit try..except um?
Hallo zusammen,
Bei meinen SQL-Abfragen gibt es manchmal z.B diese Meldung: "Im Projekt xxxx.exe ist eine Exception der Klasse EOleException mit der Meldung 'ORA-00942: table or view does not exist' aufgetreten." diese Meldung möchte ich über einen Try..Except Block abfangen und dabei hereaus bekommen, welche Tabelle nicht existiert. Wie mache ich das?
Delphi-Quellcode:
Das bringt mich nicht so richtig weiter.
..
try DM_ADOQuery1.open; except on E: Exception do begin ShowMessage( Format('%s: %s.', [E.ClassName, E.Message])); end; end; Gruß K-H |
AW: wie geht man richtig mit try..except um?
Delphi-Quellcode:
Versuch mal "Exception" durch "EOleException" zu ersetzen.
..
try DM_ADOQuery1.open; except on E: EOleException do begin ShowMessage( Format('%s: %s.', [E.ClassName, E.Message])); end; end; |
AW: wie geht man richtig mit try..except um?
Wenn die Klasse nicht mehr Informationen in der Exception liefert, wirst du da auch nicht mehr rausholen können.
|
AW: wie geht man richtig mit try..except um?
Das
Delphi-Quellcode:
kann man sich als Folgendes vorstellen:
on E: Exception do
Delphi-Quellcode:
ON prüft als den Type der Exception, also ob dieser mindestens dem angegebenem Typen entspricht und erstellt dann (total delphiuntypisch) eine Variable, mit dem angegebenem Namen (E).
if ExceptObject is Exception then begin
E := ExceptObject; ... end; Man kann also mehrere ON-DO-Bedingenen angeben und auf bestimmte Eigenschaften prüfen, falls ein bestimmter Typ mehr Infos liefert oder man sich die IS-Abfrage sparen will. PS: ist alles das Selbe...
Delphi-Quellcode:
except
on E: EOutOfMemory do ShowMessage('ungenügend Speicher'); on E: Exception do ShowMessage(Format('unbekannter Fehler "%s": %s', [E.ClassName, E.Message])); end;
Delphi-Quellcode:
except
on E: Exception do if E is EOutOfMemory then ShowMessage('ungenügend Speicher') else ShowMessage(Format('unbekannter Fehler "%s": %s', [E.ClassName, E.Message])); end;
Delphi-Quellcode:
except
if ExceptObject is EOutOfMemory then ShowMessage('ungenügend Speicher') else ShowMessage(Format('unbekannter Fehler "%s": %s', [ExceptObject.ClassName, (ExceptObject as Exception).Message])); end; |
AW: wie geht man richtig mit try..except um?
"Informationanreicherung" wäre hier das Mittel der Wahl.
Das macht natürlich etwas Arbeit, weil man die Exceptions abfangen muss und mit lokalen Informationen anreichert.
Delphi-Quellcode:
Hier noch die Hilfsfunktion
try
DM_ADOQuery1.open; except on E: Exception do begin E.Message := 'Fehler in Abfrage '+ GetComponentName(DM_ADOQuery1)+#13#10+ E.Message; raise; // Exception erneut auslösen end; end;
Delphi-Quellcode:
function GetComponentName(comp:TComponent) : string;
begin Result := comp.Name; if Result = '' then begin // wenn die Komponenten keinen Namen hat, dann vielleicht einen Index if comp.ComponentIndex <> -1 then Result := '['+comp.ClassName+'#'+IntToStr(comp.ComponentIndex)+']' else // nur Klassenname Result := '['+comp.ClassName+']'; end; end; |
AW: wie geht man richtig mit try..except um?
Zitat:
|
AW: wie geht man richtig mit try..except um?
Zitat:
Zitat:
Edith: Zitat:
Gruß K-H |
AW: wie geht man richtig mit try..except um?
Wir machen das manchmal so, das wir die SQL-Statements in ein Skript schreiben (dem auch eine Log-Dateinamen übergeben) und das dann per CreateProcess usw. von SQLPlus ausführen lassen.
Dann durchsuchen wir das Log-File nach dem Wörtchen Error und falls das vorhanden ist, geben wir das Log-File als Fehlermeldung raus und haben dann u.a. das "schöne *" an der betreffenden Stelle und auch eine Zeilennummer, wo der Fehler war. Das geht aber mMn nicht, wenn wir irgendwelche ADO-Komponenten benutzen. Die geben nur die eigentliche Fehlermeldung zurück, aber nicht was dann noch kommt und z.B. im Log stünde. |
AW: wie geht man richtig mit try..except um?
Hübsche Idee, nur der Export der Daten ist dann ein wenig fummelig.
Gruß K-H |
AW: wie geht man richtig mit try..except um?
Hallo,
Insbesondere bei Exceptions mit ADO: Die TADOConnection-Klasse besitzt eine Eigenschaft Errors, welche mehrere Elemente der Klasse Error mit der genauen Fehlerbeschreibung enthalten kann. Man kann die Exception mit dem Text dieser Fehlermeldungen anreichern:
Delphi-Quellcode:
var
Err: ADODB.Error; i: Integer; begin try ADOQuery1.Open(); except On E: Exception do begin for i := 0 to ADOQuery1.Connection.Errors.Count - 1 do begin Err := ADOQuery1.Connection.Errors.Item[i]; E.Message := E.Message + #13#10 + Format('(%d): %s', [Err.NativeError, Err.Description]); end; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz