Autor Thema: Realisierung von Exception Handling  (Gelesen 7289 mal)

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« am: 15. July 2006, 17:47 »
Hallo, ich überlege seit einiger Zeit wie genau bei C++ Programmen das Exception Handling realisiert wird. Damit meine ich, wie genau es funktioniert, dass der richtige catch-Block aufgerufen wird, nachdem eine Exception "geworfen" wurde? Ein kleines Beispiel:
try{
  throw(5);
}catch(float f){
}catch(int i){
}

Das Einfachste wäre es ja nun, wenn die throws fest mit den entsprechenden catch-Blöcken verdratet wären, aber das geht ja schonmal aus dem Grunde nicht, da es ja auch "unerwartete" Exceptions gibt (wie zB Divison durch 0).
Meine Vorstellung wäre nun, dass beim Eintritt in den Try-Block eine Liste mit allen Exception-Typen, die gefangen werden sollen, angelegt wird (hier float und int (für die, die es nicht wissen, man kann auch primitive Datentypen "werfen", nicht nur Exception-Objekte)) und zusätzlich zum Typ die Adresse des Behandlungsblocks. Wenn nun ein throw auftritt wird diese Liste durchgeschaut und der entsprechende Block aufgerufen (falls vorhanden). Aber nun ist die Frage (falls dies so gemacht wird), ob diese Liste vom Programm, oder vom Betriebssystem verwaltet wird, da dieses ja auch Exceptions wirft, wenn das Programm mist baut (wie zB bei Division durch 0). Außerdem werden die Exceptions ja über ihren Datentyp auseinandergehalten, wie aber geschieht das zur Laufzeit? Ich meine C++ ist ja nicht Java, wo jedes Objekt seinen Typ weiß...

Hat irgendwer da eine Idee, oder auch eine Webadresse (alles was ich gefunden habe erklärt lediglich die Benutzung von Exceptions)?

MM

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 15. July 2006, 18:42 »
hi,

ich kann dir zwar leider nichts erklären, da ich selbst die zwei artikel nur überflogen habe, aber trotzdem:
Die ABI vom g++
The Code Project: How a C++ compiler implements exception handling
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #2 am: 15. July 2006, 21:07 »
Ich hab zwar noch nicht alles gelesen, aber das zweite Dokument ist sehr interessant, danke.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 16. July 2006, 00:02 »
Zitat von: [MM]
Aber nun ist die Frage (falls dies so gemacht wird), ob diese Liste vom Programm, oder vom Betriebssystem verwaltet wird, da dieses ja auch Exceptions wirft, wenn das Programm mist baut (wie zB bei Division durch 0).

C++-Exceptions haben nichts mit den Exceptions, die von der Hardware generiert werden, zu tun. Diese Konzepte sind nicht gleichzusetzen. Wenn z.B. eine Division durch 0 auftritt und das Betriebssystem die Exception an das Programm weiterleitet, tut es das unabhängig von der verwendeten Sprache. Es wird einfach ein Callback aufgerufen, ein Signal gesendet, oder sonstwie IPC gemacht. Erst die Behandlungsroutine im Programm bastelt daraus eine C++-Exception.
Dieser Text wird unter jedem Beitrag angezeigt.

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #4 am: 24. July 2006, 02:46 »
Hab mich jetzt mal etwas damit beschäftigt, habe aber noch ein Problem mit der ganzen Sache: Damit das Exception-Handling funktioniert muss ein "runtime type identification"-System (RTTI) implementiert werden. Dieses RTTI ermöglicht es zur Laufzeit den Datentyp eines C++ Objektes festzustellen (was mir eher nach Java klingt) um dann den entsprechenden Catch-Block aufrufen zu können (zB throw(2) wird von catch(int a) gefangen).
Wenn ich ein solches Execption-Handling-System realisieren möchte, würde ich es gerne ohne RTTI machen, indem ich zB nur Exceptions einer bestimmten Exceptionklasse (oder davon abgeleitete Klassen) zulasse, welche dann zB eine eindeutige ID enthalten müßten (wobei da das Problem wäre diese ID eindeutig zu halten). Hat da einer von euch eine bessere Idee?

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #5 am: 24. July 2006, 10:54 »
Das hat nichts mit Java zu tun - RTTI ist ein wichtiger Bestandteil von modernen Programmiersprachen, so wie C++, D, Java. Ich wuerde, wenn schon, alles standardkonform implementieren um eine moeglichst hohe Kompatibilitaet, zumindest auf Sprach-Ebene, zu erreichen. Aber, ich wuerde es auch verstehen, wenn du sagst: "Scheiss auf den C++ Standard!". :P

Lg, Alex
\\o
o//
\o/

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #6 am: 24. July 2006, 12:23 »
Ja, mir ist schon klar, dass das RTTI nichts mit Java zu tun hat, dennoch ist es mir SEHR suspekt und ich hätte das so nicht von C++ erwartet, jedoch fällt mir auch keine andere sinnvolle Möglichkeit ein das Exceptionhandling zu implementieren...

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #7 am: 24. July 2006, 13:44 »
Soweit ich das weiß speichert RTTI in jeder Klasse nur einen Pointer auf eine statische Struktur mit Typinformationen, also zum einen einen String mit dem Namen, zum anderen Informationen zur Inheritance. Wenns dann um Klassen geht würd ich einfach in jedem catch block den Pointer zu dieser Struktur einfügen und dann, wenn eine Exception gemissen (also bei throw, da auch den Pointer einfügen) wurde die pointer vergleichen, falls gleich, dann springen.
Falls es ein nativer Datentyp ist, dann würd ich das genauso machen. Also immer bei throw/catch einen Pointer auf ne statrische struktur und dann bei ner exception vergleichen.

edit: Zumindest macht das imho der g++ so. Siehe da auch ABI vom g++ (siehe 2.9). Da gibts ja bei RTTI die ganzen strukturen mit typinformationen.

Und dass hat wirklich nix mit Java zu tun :)
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #8 am: 24. July 2006, 14:15 »
((das mit JAVA habe ich auch nur gesagt, da C/C++ ja eigentlioch nicht dafür bekannt ist, dass die Objekte ihren Datentyp kennen, im Gegenastz zu JAVA))

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #9 am: 24. July 2006, 14:23 »
Lies mein Post nochmal, die Objekte (hier mein ich nur native Datentypen) kennen ihren Typ nicht. Nur bei throw & catch wird zu dem Wert des Objekts noch ein Pointer auf eine statische Struktur gespeichert. btw. typeid operator geht auf alle typen, also auch auf native datentypen, da wird das aber zur Compilezeit aufgelöst.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

 

Einloggen