Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

21

18.05.2007, 13:44

So hier mein erstes Prog mit Ausnahmen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>

using namespace std;

int main()
{
    
    try 

    { 
       throw std::logic_error( "Hallo Welt!" ); 
    } 
        
    catch ( const std::logic_error& e ) 

    { 
        std::cout << e.what() << std::endl; 
    }

    return 0;
}


Es erscheint: Hallo Welt!

Es wäre doch wesentlich einfacher zuschreiben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

using namespace std;

int main()
{
    std::cout<<"Hallo Welt!"<<endl;
    

    return 0;
}


Es erscheint: Hallo Welt!
Ist das selbe wie oben....

und @ Ausnahmen werfen:

was ist die Ausnahme von: throw 10; ? etwas: 0,1,2,3,4,5,6,7,8,9,11...?
oder die Ausnahme von throw std::string( "Hallo Welt" ); ?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

22

18.05.2007, 14:13

Du hast den Sinn anscheinend noch nicht ganz verstanden.

C-/C++-Quelltext

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
#include <iostream>
#include <stdexcept>

float divide( int a, int b ) throw( std::logic_error )
{
    if ( b == 0 )
        throw std::logic_error( "Divide by null" );

    return a / b;
}

int main()
{
    int a = 10;
    int b = 0;

    //std::cout << ( a / b ) << std::endl; // undefinierbares verhalten


    try
    {
        divide( a, b );
    }
    catch ( const std::logic_error& e )
    {
        std::cout << "Error: " << e.what() << std::endl;
    }
}


Würdest du a durch b teilen wie in der auskommentierten Zeile dann würde sich dein Programm wahrscheinlich vertabschieden. Die Funktion divide prüft auf die korrektheit des Parameters b und wirft ggf eine Ausnahme die ich dann abfangen kann und entsprechend behandeln kann.

Ausnahmen beschreiben nicht eine Art der Textausgabe sondern das Programm möglichst vor Fehlern abzusichern und ggf darauf reagieren zu können.

Und wenn du eine Ausnahme wirfst so kannst du Informationen in ein Objekt packen und dieses als "Ausnahmeobjekt" werfen. Sodass du anderswo (im catch-Block) auf die Informationen zugreifen kannst und ggf weißt was für ein Fehler wo warum aufgetreten ist...
@D13_Dreinig

23

18.05.2007, 14:43

Zitat


Und wenn du eine Ausnahme wirfst so kannst du Informationen in ein Objekt packen und dieses als "Ausnahmeobjekt" werfen. Sodass du anderswo (im catch-Block) auf die Informationen zugreifen kannst und ggf weißt was für ein Fehler wo warum aufgetreten ist...


Ja und genau da ist der Vorteil von Exceptions! Allerdings finde ich dass man sparsam mit ihnen umgehen soll! Man sollte wenn man n Lib schreibt nicht alles vollpacken und dem Benutzer 1000 Catchblöcke aufzwingen ;-)

ALso würd ich sie mit Vorsicht genießen ;-)
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

24

18.05.2007, 14:49

Wieso nicht? :) Ich kenn mindestens ein Projekt das hat mindestens genau so viele try-catch Bläcke wie Funktionen. :D
@D13_Dreinig

25

19.05.2007, 09:18

ok jetzt hab ich es (teilweise) verstanden. THX

Jetzt hab ich bisschen rum experimentiert und wieder ein prob. :x

Falls ich durch null teile soll nur die Fehlermeldung rauskommen.. nicht mehr das ergebniss... wie kann ich da mit der try und catch schleife eine if-schleife mit dem std::cout<<a/b<<endl; bilden?

C-/C++-Quelltext

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
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream> 
#include <stdexcept> 

using namespace std;

float divide( float a, float b ) throw( std::logic_error ) 
{ 
    if ( b == 0 ) 
        throw std::logic_error( "Divide by null" ); 

    return a / b; 
} 

int main() 
{ 
    float a ; 
    float b ; 

    std::cin>>a;

    std::cout<<endl;

    std::cin>>b;

    //std::cout << ( a / b ) << std::endl; // undefinierbares verhalten 


    try 
    { 
        divide( a, b ); 
    } 
    catch ( const std::logic_error& e ) 
    { 
        std::cout << "Error: " << e.what() << std::endl; 
    } 


    std::cout<<a/b<<endl;


} 

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

27

19.05.2007, 10:39

und wie wird das aussehen?

Dofter

Treue Seele

Beiträge: 159

Wohnort: im wunderbaren EBERMANNSTADT

Beruf: Schüler^^

  • Private Nachricht senden

28

19.05.2007, 11:53

so z.B.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
    try
    {
        float e = divide( a, b );
        std::cout<<e<<endl;

    }
    catch ( const std::logic_error& e )
    {
        std::cout << "Error: " << e.what() << std::endl;
    }


Wenn die Exception auftritt wird ja der try-Block verlassen und zu catch gesprungen. Wenn also jetzt eine Exception auftritt wird cout erst gar nicht mehr aufgerufen.
"Wo kämen wir hin, wenn alle sagten, wo kämen wir hin, und keiner ginge,
um zu sehen, wohin wir kämen, wenn wir gingen"

29

19.05.2007, 16:56

d.h. falls die funktion divide negativ ausfällt wird sofort der try block verlassen und zum catch block weitergeleitet?

und wenn sie positiv ist, dann wird der try-block vollständig durchgegangen und der catch-block übersprungen?

Dofter

Treue Seele

Beiträge: 159

Wohnort: im wunderbaren EBERMANNSTADT

Beruf: Schüler^^

  • Private Nachricht senden

30

19.05.2007, 17:37

wenn im try-Block eine Exception auftritt, wird sofort nach einem passenden catch block gesucht. Falls einer gefunden wurde springt er hinein. Mehrzahl, da man auch meherer catchblöcke verwenden kann: z.b ein catch block für char* einer für int. Jenachdem was für eine exception aufgerufen wurde.
Wenn keine Exeptionauftritt springt er natürlich auch nicht plötzlich igendwo hin. Erst wenn in einem try Block, in dem du wie "Das Gurke" schon sagte, beliebigen c++ code schreiben kannst, eine Exception auftritt wir aus try gesprungen und nach einem passenden catch gesucht. Falls kein passender catch block (es wird automatisch auch eine Standarttypumwandlung probiert) wird das Programm trotzdem duch die Funktion terminate() regulär beendet. Wie weiter oben schon steht gibt es auch catch(...) worein bei im Falle es wird nichts gefunden, hineingesprungen wird.
"Wo kämen wir hin, wenn alle sagten, wo kämen wir hin, und keiner ginge,
um zu sehen, wohin wir kämen, wenn wir gingen"

Werbeanzeige