Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: C++ (alle ISO-Standards) ::  Problem mit throw()  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Programmierer
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.07.2007
Beiträge: 57
Beitrag Programmierer Mitglied 15:43:42 27.09.2008   Titel:   Problem mit throw()            Zitieren

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void foo(void) throw() //<=====
{
    throw "Fehler";
};
 
 
void handler(void)
{
    exit(1);
};
 
 
int main(int argc,char** argv)
{
    set_unexpected(handler);
   
    try
    {
    foo();
    }
    catch(char* Text)
    {
    cout << "Exception abgefangen!"<<endl;
    };
 
    return 0;
};


Hallo,
die Funktion foo soll keine Exception auslösen düfen,deshalb habe ich in der Signatur auch throw().
Mein Problem ist,dass die Exception,die in foo ausgelöst wird einfach abgefangen wird. Es müsste doch handler aufgerufen und das Programm beendet werden.
Warum wird mein throw() "ignoriert"?

Danke
Tachyon
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.12.2003
Beiträge: 3478
Beitrag Tachyon Mitglied 15:53:24 27.09.2008   Titel:              Zitieren

throw() heisst, dass Du dem Aufrufer Deiner Funktion gerantierst, dass Deine Funktion keine Exception werfen wird. Das heisst, eine Funktion die throw() in ihrer Signatur stehen hat, darf keine Exception werfen. Du wirfst aber eine Exception...

Edit: Achso, darauf willst Du hinaus...

Also bei mir läuft folgendes:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <exception>
 
void test(){
    std::cerr << "Error\n";
    std::exit(1);
}
 
void bla() throw(){
    throw 0;
}
 
int main(){
    std::set_unexpected(test);
    try{
        bla();
    }
    catch(...){
        std::cerr << "Catched error\n";
    }
}


Ausgabe:
Error

_________________
タキオン


Zuletzt bearbeitet von Tachyon am 16:19:21 27.09.2008, insgesamt 1-mal bearbeitet
Simon2
Mitglied

Benutzerprofil
Anmeldungsdatum: 10.08.2006
Beiträge: 4480
Beitrag Simon2 Mitglied 16:59:42 27.09.2008   Titel:   Re: Problem mit throw()            Zitieren

Ich tippe mal auf einen schlechten Compiler.
Der MS VS6.0 z.B. ignoriert einfach exception specifications ...

Vielleicht kann man das auch abschalten...
welchen Compiler hast Du denn ?

Gruß,

Simon2.

_________________
Man lernt nie aus ...
Programmierer
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.07.2007
Beiträge: 57
Beitrag Programmierer Mitglied 17:25:46 27.09.2008   Titel:              Zitieren

Ich benutze Microsoft Visual C++ 2008 Express (/EHsc)


Zuletzt bearbeitet von Programmierer am 17:52:46 27.09.2008, insgesamt 1-mal bearbeitet
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 4617
Beitrag theta Mitglied 17:35:46 27.09.2008   Titel:              Zitieren

Programmierer schrieb:
Ich benutze Microsoft Visual C++ 2008 Express.

Und wie ist der Kompilerswitch /EH ??
http://msdn.microsoft.com/de-de/library/1deeycx5.aspx
Simon
Braunstein
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.05.2002
Beiträge: 7080
Beitrag Braunstein Mitglied 09:40:01 28.09.2008   Titel:              Zitieren

@Programmierer
Der catch Zweig passt auch nicht. Du wirfst ein const char* und willst ein char* fangen.
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 4617
Beitrag theta Mitglied 11:08:07 28.09.2008   Titel:              Zitieren

Braunstein schrieb:
@Programmierer
Der catch Zweig passt auch nicht. Du wirfst ein const char* und willst ein char* fangen.

Was dann aber eher dafür sprechen würde, dass die exception nicht gefangen und der unexpected handler aufgerufen wird. Das ist aber ja genau nicht der Fall.
Simon
Braunstein
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.05.2002
Beiträge: 7080
Beitrag Braunstein Mitglied 11:42:14 29.09.2008   Titel:              Zitieren

Ich hatte den Code bei mir getestet (CodeBlocks mit MinGW) und da verhielt sich der Compiler wie erwartet.
Wenn throw() gesetzt war, wurde der unexpected-handler aufgerufen.
Wenn throw() nicht gesetzt war, wurde das Programm abgebrochen (Exception nicht gefangen).
Wenn im catch-Zweig const char* stand, wurde die Exception gefangen.

Der VC8 scheint sich da anders zu verhalten. Er gibt aber eine Warnung bezüglich foo raus.

[edit]Ich habs gerade noch mal mit dem BCB2007 getestet und der verhält sich wie der MinGW.[edit]


Zuletzt bearbeitet von Braunstein am 11:46:57 29.09.2008, insgesamt 2-mal bearbeitet
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 23493
Beitrag hustbaer Mitglied 16:36:33 29.09.2008   Titel:              Zitieren

Komisch.
MSVC kann zwar keine "nicht-leeren" throw-specs, aber MS behauptet zumindest dass "throw()" korrekt unterstützt wird (ab 2003 oder 2005 - auf jeden Fall vor 2008). Auch Käse wenn das in echt garnicht geht :(

_________________
Until every person can enjoy all their human rights, we will not stop. I support Amnesty International. Will you?
https://www.amnesty.org / https://www.amnesty.de / https://www.amnesty.at
camper
Moderator

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 7142
Beitrag camper Moderator 18:15:37 29.09.2008   Titel:              Zitieren

hustbaer schrieb:
Komisch.
MSVC kann zwar keine "nicht-leeren" throw-specs, aber MS behauptet zumindest dass "throw()" korrekt unterstützt wird (ab 2003 oder 2005 - auf jeden Fall vor 2008). Auch Käse wenn das in echt garnicht geht :(
vc unterstützt Exceptionspezifikationen grundsätzlich nicht. Das ist eine bewusste Designentscheidung - wenn sie auch dem Standard widersprechen mag. Wird die Spezifikation verletzt, ist das Verhalten dann undefiniert (und löst eben nicht zwingend den Aufruf von unexpected() aus). Eine leere Exceptionspezifikation kann demgemäß für zusätzliche Optimierungen genutzt werden (eine Eigenheit von vc ist z.B., dass Funktionen, die eine Klassenobjekt zurückgeben, dessen Destruktor möglicherweise eine Exception wirft, niemals inline-expandiert werden - eine leere Exceptionspezifikation beim Destruktor kann hier mitunter abhelfen).
C++ Forum :: C++ (alle ISO-Standards) ::  Problem mit throw()  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.