Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   wie geht man richtig mit try..except um? (https://www.delphipraxis.net/160803-wie-geht-man-richtig-mit-try-except-um.html)

p80286 1. Jun 2011 12:14

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:
..
try
    DM_ADOQuery1.open;
  except
    on E: Exception do
    begin
      ShowMessage( Format('%s: %s.', [E.ClassName, E.Message]));
    end;
  end;
Das bringt mich nicht so richtig weiter.

Gruß
K-H

Coffeecoder 1. Jun 2011 12:20

AW: wie geht man richtig mit try..except um?
 
Delphi-Quellcode:
..
try
    DM_ADOQuery1.open;
  except
    on E: EOleException do
    begin
      ShowMessage( Format('%s: %s.', [E.ClassName, E.Message]));
    end;
  end;
Versuch mal "Exception" durch "EOleException" zu ersetzen.

Luckie 1. Jun 2011 12:22

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.

himitsu 1. Jun 2011 12:32

AW: wie geht man richtig mit try..except um?
 
Das
Delphi-Quellcode:
on E: Exception do
kann man sich als Folgendes vorstellen:
Delphi-Quellcode:
if ExceptObject is Exception then begin
  E := ExceptObject;
  ...
end;
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).

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;

shmia 1. Jun 2011 12:33

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:
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;
Hier noch die Hilfsfunktion
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;

mjustin 1. Jun 2011 12:33

AW: wie geht man richtig mit try..except um?
 
Zitat:

Zitat von p80286 (Beitrag 1104110)
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:
..
try
    DM_ADOQuery1.open;
  except
    on E: Exception do
    begin
      ShowMessage( Format('%s: %s.', [E.ClassName, E.Message]));
    end;
  end;
Das bringt mich nicht so richtig weiter.

Gruß
K-H

Ich würde der Errormessage den SQL Text der ADOQuery noch hinzufügen, wenn der Tabellenname darin enthalten ist. Alternativ kann generell mit einem Logger wie Log4D die SQL Statements loggen, auf einem niedrigen Logginglevel.

p80286 1. Jun 2011 12:34

AW: wie geht man richtig mit try..except um?
 
Zitat:

Zitat von Coffeecoder (Beitrag 1104113)
Versuch mal "Exception" durch "EOleException" zu ersetzen.

da ist der Informationsgehalt genauso mager.

Zitat:

Zitat von Luckie (Beitrag 1104114)
Wenn die Klasse nicht mehr Informationen in der Exception liefert, wirst du da auch nicht mehr rausholen können.

Jain, da SQL+ so schöne * unter die Fehlerposition machen kann, sollte diese Information eigentlich irgendwo vorhanden sein.

Edith:
Zitat:

Zitat von mjustin (Beitrag 1104118)
Ich würde der Errormessage den SQL Text der ADOQuery noch hinzufügen, wenn der Tabellenname darin enthalten ist. Alternativ kann generell mit einem Logger wie Log4D die SQL Statements loggen, auf einem niedrigen Logginglevel.

Bei mir liegen SQLText und Fehlermeldung direkt vor, aber bei 5..20 Tabellen ist das auch nicht so Hilfreich, ich würde ja gerne wissen an welcher er sich verschluckt hat.


Gruß
K-H

Jumpy 1. Jun 2011 14:27

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.

p80286 1. Jun 2011 15:31

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

ele 1. Jun 2011 18:07

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