AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

wie geht man richtig mit try..except um?

Ein Thema von p80286 · begonnen am 1. Jun 2011 · letzter Beitrag vom 1. Jun 2011
Antwort Antwort
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

wie geht man richtig mit try..except um?

  Alt 1. Jun 2011, 12:14
Delphi-Version: 7
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 ( 1. Jun 2011 um 16:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Coffeecoder
Coffeecoder

Registriert seit: 27. Apr 2011
242 Beiträge
 
Delphi 6 Enterprise
 
#2

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

  Alt 1. Jun 2011, 12:20
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.
Coffeecoder
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

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

  Alt 1. Jun 2011, 12:22
Wenn die Klasse nicht mehr Informationen in der Exception liefert, wirst du da auch nicht mehr rausholen können.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 1. Jun 2011, 12:32
Das 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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

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

  Alt 1. Jun 2011, 12:33
"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;
Andreas
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#6

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

  Alt 1. Jun 2011, 12:33
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.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

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

  Alt 1. Jun 2011, 12:34
Versuch mal "Exception" durch "EOleException" zu ersetzen.
da ist der Informationsgehalt genauso mager.

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:
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 ( 1. Jun 2011 um 12:37 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#8

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

  Alt 1. Jun 2011, 14:27
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.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

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

  Alt 1. Jun 2011, 15:31
Hübsche Idee, nur der Export der Daten ist dann ein wenig fummelig.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
ele

Registriert seit: 18. Feb 2009
129 Beiträge
 
Delphi 2010 Professional
 
#10

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

  Alt 1. Jun 2011, 18:07
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 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