Dakuan
Anmeldungsdatum: 2. November 2004
Beiträge: 6339
Wohnort: Hamburg
|
Ich habe da wieder mal eine Frage, zu der mir meine Bücher keine Antwort geben wollen. Ich möchte eine externe Lib einbinden, wo die Funktionen Exceptions werfen können, die ich abfangen möchte. Die Funktionen dieser Lib sollen Bestandteil einer neuen Klasse sein. Alle Programmbeispiele, die ich dazu bisher gefunden habe, gehen davon aus, das die try-catch Blöcke fest und direkt miteinander verkoppelt sind (in main() ). Da ich die Behandlung der Exceptions innerhalb der Klasse abhandeln möchte, würde das erstmal bedeuten, das ich in jede Member Funktion einen try-catch Block einbauen muss. Das erscheint mir erstmal wenig effektiv. Ich frage mich daher, ob es irgendwie möglich ist, ein "catch" pauschal für alle Members einer Klasse einzurichten. Letztendlich möchte ich erreichen, das beim Auftreten von Fehlern innerhalb dieser Klasse das Programm normal weiter läuft, aber die zugehörigen Menüeinträge deaktiviert werden (per Callback Funktion). Gibt es da eine elegante Vorgehensweise?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12802
|
Dakuan schrieb:
Ich frage mich daher, ob es irgendwie möglich ist, ein "catch" pauschal für alle Members einer Klasse einzurichten.
Soweit mir bekannt, existiert diese Möglichkeit nicht in C++.
Letztendlich möchte ich erreichen, das beim Auftreten von Fehlern innerhalb dieser Klasse das Programm normal weiter läuft, aber die zugehörigen Menüeinträge deaktiviert werden (per Callback Funktion). Gibt es da eine elegante Vorgehensweise?
Der cpp und Templates fallen mir da ein...
|
Dakuan
(Themenstarter)
Anmeldungsdatum: 2. November 2004
Beiträge: 6339
Wohnort: Hamburg
|
Soweit mir bekannt, existiert diese Möglichkeit nicht in C++.
Ich habe mich inzwischen damit abgefunden. Es hat sich auch herausgestellt, das dies nur an 3 Stellen auftritt. Das geht dann gerade noch. Und das mit dem deaktivieren von Menüeinträgen war in diesem Fall Quatsch, denn der Fehler kann während des Betriebs auftreten und durch eine korrigierte Eingabe auch wieder behoben werden. Was ich aber herausgefunden habe ist, dass man in der Klasse eine zentrale Behandlungsmethode einbauen kann. Diese muss dann allerdings in jedem catch Block aufgerufen werden und außerdem wohl auch statisch sein. Das kommt dem was ich ursprünglich wollte wohl am nächsten, aber ich habe das jetzt nicht ausprobiert. Ich setze das trotzdem mal auf "gelöst".
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12802
|
Dakuan schrieb:
Was ich aber herausgefunden habe ist, dass man in der Klasse eine zentrale Behandlungsmethode einbauen kann. Diese muss dann allerdings in jedem catch Block aufgerufen werden und außerdem wohl auch statisch sein.
Aber dann wirst Du die ganzen try-catch-Blöcke ja nicht los. War das nicht Dein ursprüngliches Ziel? Ansonsten ist es natürlich kein Problem, überall try-catch-Blöcke zu definieren und dann aus dem catch immer eine Methode aufzurufen. Die muss m.E. auch nicht statisch sein (es sei denn, die Methode ist es).
|
Dakuan
(Themenstarter)
Anmeldungsdatum: 2. November 2004
Beiträge: 6339
Wohnort: Hamburg
|
Aber dann wirst Du die ganzen try-catch-Blöcke ja nicht los. War das nicht Dein ursprüngliches Ziel?
Eigentlich ja, aber wenn niemand weiß, wie/ob das geht, oder das zu aufwändig ist, muss ich das wohl so hinnehmen. Klar ist jedenfalls, das ich darauf reagieren muss. Es kann ja nicht sein, das ein Programm nach umfangreicher Texteingabe abstürzt, nur weil später fest gestellt wird, dass eine Einstellung fehlerhaft ist.
Die muss m.E. auch nicht statisch sein ...
Ok, da haben meine grauen Zellen wohl etwas falsch abgespeichert. Ich hatte in letzter Zeit sehr viel Neues gelesen und wohl nicht alles richtig einsortiert.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12802
|
Dakuan schrieb: Aber dann wirst Du die ganzen try-catch-Blöcke ja nicht los. War das nicht Dein ursprüngliches Ziel?
Eigentlich ja, aber wenn niemand weiß, wie/ob das geht, oder das zu aufwändig ist, muss ich das wohl so hinnehmen.
Du brauchst ja "nur" ein entsprechendes CPP-Makro zu definieren. 😉
Klar ist jedenfalls, das ich darauf reagieren muss. Es kann ja nicht sein, das ein Programm nach umfangreicher Texteingabe abstürzt, nur weil später fest gestellt wird, dass eine Einstellung fehlerhaft ist.
Klar.
|
Dakuan
(Themenstarter)
Anmeldungsdatum: 2. November 2004
Beiträge: 6339
Wohnort: Hamburg
|
Du brauchst ja "nur" ein entsprechendes CPP-Makro zu definieren.
Das verstehe ich jetzt nicht, oder meinst Du ein einfaches Text-Makro, das mir die Tipparbeit abnimmt und schöner aussieht?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12802
|
Dakuan schrieb: Du brauchst ja "nur" ein entsprechendes CPP-Makro zu definieren.
Das verstehe ich jetzt nicht, oder meinst Du ein einfaches Text-Makro, das mir die Tipparbeit abnimmt und schöner aussieht?
Ja, sowas wie | #DEFINE tc(code) try { code } catch (const Excetption& e) { handler_method(e); }
|
Oder noch länger inklusiver Methodendeklaration.
|
Dakuan
(Themenstarter)
Anmeldungsdatum: 2. November 2004
Beiträge: 6339
Wohnort: Hamburg
|
Das gefällt mir. Bei einheitlicher Behandlungsmethode gut anwendbar.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12802
|
Dakuan schrieb: Das gefällt mir. Bei einheitlicher Behandlungsmethode gut anwendbar.
Ja, aber es ist ungemein hacky. Templates wären typsicherer, aber dafür fehlt mir gerade die Zeit und ich kann es nicht aus dem Ärmel schütteln.
|
Dakuan
(Themenstarter)
Anmeldungsdatum: 2. November 2004
Beiträge: 6339
Wohnort: Hamburg
|
Ja, aber es ist ungemein hacky.
Also doch. In meinem C++ Buch steht auch, dass diese Art Makros unschön ist, deshalb habe ich nicht sofort verstanden.
Templates wären typsicherer,...
Das erscheint mir für mein aktuelles Projekt zu aufwändig. Mit Hacks kann ich leben. Meine Programme müssen ja nicht per Zertifikat nachweisen, dass bestimmte Designkriterien erfüllt wurden 😉
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Kannst Du evtl. mal ein minimales Beispiel geben, wie solche Aufrufe in den Methoden Deiner Klasse in die externe Lib aussehen? Und welche Typen von Ausnahmen werden denn geworfen? Immer dieselbe? Und wie sieht die Behandlung aus? Macros finde ich absolut ätzend! C++ ist eh ein Saustall von abwärtskompatiblem Mist, aber ausgerechnet dieses C-esque-Präcompiler-Zeugs toppt so einiges. Wer mal mit MFC proggen durfte kennt diese Schmerzen... Ich habe so das Gefühl, dass man da etwas besseres schaffen kann, was auch nicht unbedingt komplexer sein muss.
|
Dakuan
(Themenstarter)
Anmeldungsdatum: 2. November 2004
Beiträge: 6339
Wohnort: Hamburg
|
Ich habe da wohl mehr Probleme befürchtet als dann tatsächlich aufgetreten sind. Übrig geblieben ist dann folgendes: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | // Set a new language
int zk_spell::set_lang( const char * lang ) {
err_flg = 0;
try {
strncpy( lang_tag, lang, sizeof( lang_tag ) );
if( dict ) {
delete dict;
dict = 0;
}
dict = broker->request_dict( lang );
} catch ( const enchant::Exception & ex ) {
err_text = ex.what();
if( dict ) {
delete dict;
dict = 0;
}
err_flg = 2;
}
return err_flg;
}
|
das taucht so im Konstruktor auch auf, und dann noch:
| int zk_spell::list_dicts( void ) {
err_flg = 0;
try {
broker->list_dicts( enchant_cb, this );
}
catch ( const enchant::Exception & ex ) {
err_text = ex.what();
err_flg = 1;
}
return err_flg;
}
|
Ich selber habe noch keine Klassen entworfen, die Exceptions werfen. Ist halt neu für mich.
Und welche Typen von Ausnahmen werden denn geworfen? Immer dieselbe?
Soweit ich das erkennen konnte, wirft libenchant immer einen c_string. Wenn ich nur einen Fehlercode haben will, muss ich den selber erzeugen.
Wer mal mit MFC proggen durfte kennt diese Schmerzen...
Um MFC habe ich immer einen Bogen gemacht (CPP war damals noch ein Fremdwort für mich). Aber direkt mit dem Win API zu arbeiten fand ich auch nicht sehr erbaulich.
|