Exceptions oder If



  • Wann benutzt man Exceptions und wann If-Blöcke ?
    Sind Exceptions OOP ? [Edit] Besser ist was benutzt man in der OOP eher.

    [ Dieser Beitrag wurde am 02.04.2003 um 12:27 Uhr von C Newbie editiert. ]



  • hm, das hab ich doch hier neulich erst gesehen... Exceptions vs. Eigenes Errorcode -system



  • Das ist mir auch noch nicht so ganz klar. Sollte man jetzt immer und überall Exceptions benutzen und nirgendwo mehr solche Fehlerabfragen mit if machen?



  • Original erstellt von DrGreenthumb:
    hm, das hab ich doch hier neulich erst gesehen... Exceptions vs. Eigenes Errorcode -system

    Das beantwortet aber nicht meine Fragen.
    Sollte man immer nur Ifs oder immer nur Exceotions benutzen ?

    [ Dieser Beitrag wurde am 02.04.2003 um 12:26 Uhr von C Newbie editiert. ]



  • Weder noch, beides nur wenn es Sinn macht. Nur if oder nur exceptions kann man so nicht sagen...



  • Ja und wann macht was Sinn? Das soll uns mal jemand erklären. 🕶



  • Bei der Frage gibt es kein "entweder oder,".Das kommt immer ganz darauf an.Wenn du z.B. eine komplexe Berechnung durchführst:

    for(i=0;i<5;i++)
    {
      //irgend ein Quatsch
      Var3 *= 2;
      Var2 +=1;
      erg += (erg/((Variable1/Var2)+7))/(((5*Var2)/Variable1)/Var3));
    }
    

    Wenn du hier mit if's sicherstellen möchtest dass keine Division durch 0 auftritt hast du einiges zu tun weil du sicherstellen musst das keines der Zwischenergebnisse 0 ergibt!

    MfG Spacelord 🙂

    [ Dieser Beitrag wurde am 02.04.2003 um 12:55 Uhr von Spacelord editiert. ]



  • Exceptions bei kritischen Ausnahmefällen und einfache Abfragen wenn es nicht lohnt eine exception rauszuknallen. Ein Fall für eine exception wäre z.B. eine Division durch 0, eine Wurzel aus etwas negativem ein WriteSonstwas ohne die erforderlichen Schreibrechte usw., also wenn der Anwender nicht mit einer ungültigen Rückgabe rechnet (oder wenn das schrittweise abprüfen zu umständlich wäre). Ein if kannst du machen wenn du z.B. in einem Array was finden willst was garnicht da ist. Die Suchfunktion muss dann keine exception schmeißen sondern kann z.B. den Index -1 zurückgeben... Etwas einfacher vorhersehbares halt.

    EDIT: Ups, da war einer schneller 😃

    [ Dieser Beitrag wurde am 02.04.2003 um 12:57 Uhr von MaSTaH editiert. ]



  • Wieso entweder oder?

    if (Zaehler == 0) throw error;

    😉

    Im Ernst: Exeptions sind AUSNAHMEN. D.h. Fehler, die normalerweise nicht vorkommen. Also, wenn Du Dein Programm so schreibst, dass es ein Ini-File im gleichen Verzeichnis wie die exe haben will, und es dann diese Datei nicht findet, dann ist das eine Ausnahme.
    Also immer da, wo bei der Interaktion deines Programms mit der Außenwelt (in welcher Form auch immer) was auftritt, was nicht auftreten sollte, wirfst Du ne Exception. Im Allgemeinen sind das Fehler, auf die der Code nicht reagieren kann, weil er mit dem Fehler an der Stelle nichts mit anzufangen weiß und wo eine weitere Ausführung dieses Codes auch keinen Sinn mehr macht.
    Hast Du nen Taschenrechner mit graphischer Oberfläche, dann weiß Deine Divisionsfunktion nicht, was sie mit der 0 im Nenner anfangen soll. Weiterrechnen kann sie aber definitiv nicht. An der Stelle kannst Du also nicht reagieren. Also wirfst Du ne Exception in der Hoffnung, dass sich da irgendjemand drum kümmert. Das Frontend fängt diese Exception und zeigt sie dem Benutzer an.

    Sind Exceptions OOP

    Mit objektorientierung haben exceptions nix zu tun (außer vielleicht, dass man ein Objekt wirft). Das ganze fällt meines Erachtens eher in den Bereich aspektorientierte Programmierung (korrigiert mich, wenn ich Müll verzapfe).



  • Hallo,

    Weil Ihr das gerade so schön diskutiert. Wirft eine Division durch Null überhaupt eine Exception? Bei meinem Compiler (BCB5) ist das ein Signal, muss also über einen selbst definierten Signalhandler abgefangen werden. Man kann natürlich selber eine Exception werfen, aber bei jeder Division abfragen ob 0 oder nicht ist ja etwas aufwendig.

    Ciao



  • Wenn man zwei werte reinholt und die dividiert kann man in kritischen situationen selber ne exception schmeißen.



  • Man prüft die Zahlen einfach, bevor man sie dividiert!



  • Exception heißt Ausnahme. Das heißt du benutzt Exceptions dann, wenn eine Ausnahme auftritt. Muss nicht mal ein Fehler sein: Nicht jede Ausnahme ist ein Fehler, aber ein Fehler ist idR eine Ausnahme 😉



  • @Braunstein

    Speziell für den BCB: Es wird eine EDivByZero Exception geworfen. Schau mal unter dem Begriff in der Hilfe nach.



  • Original erstellt von Braunstein:
    Wirft eine Division durch Null überhaupt eine Exception? Bei meinem Compiler (BCB5) ist das ein Signal, muss also über einen selbst definierten Signalhandler abgefangen werden.

    naja, Signals sind ja auch Exceptions 🙂



  • int main() {
      try {
        raise(SIGUSR1);
      } catch(...) {
        // hä?
      }
    }
    

    ???

    denke nicht.



  • So meinte kingruedi das bestimmt nicht. Aber Signale sind auch keine Ausnahmen. Können auch ganz normale Benachrichtigungen sein.



  • Ich meinte nicht im Sinne von C++ Exceptions (obwohl es wohl Compiler geben soll, bei denen man auch Signale catchen kann), aber ansonsten erfüllen sie ja auch den Sinn von Exceptions.



  • Auch unter MSVC wirft eine "Integer Divide by Zero" keine C++-Exception, sondern eine C-Exception.
    Aber es gibt noch etwas viel Lustigeres: versucht mal eine "Float Divide by Zero" zu fangen 🙂 🙂 🙂

    #include "stdafx.h"
    #include <iostream>  
    
    int main() {
       try
       {
          float zaehler, nenner, result;      
          zaehler=1.0;
          nenner=0.0;
          result=zaehler/nenner;
       }                    
       catch(...)
       {
          std::cout << "error"; //denkste, nix mit error ;-))
       }
       return 0;
    }
    

    Viel Spaß 🙂

    [ Dieser Beitrag wurde am 02.04.2003 um 22:50 Uhr von CodeWalker editiert. ]



  • Original erstellt von kartoffelsack:
    Mit objektorientierung haben exceptions nix zu tun (außer vielleicht, dass man ein Objekt wirft). Das ganze fällt meines Erachtens eher in den Bereich aspektorientierte Programmierung (korrigiert mich, wenn ich Müll verzapfe).

    also ich finde exceptions sind mehr oop als globale error codes und getlasterror funktionen


Anmelden zum Antworten