Exception selber werfen



  • Ich habe eine Methode die eine Exception werfen soll, siehe Code unten.
    Dieser Code funktioniert soweit auch fast immer, nur manchmal tritt anstelle der von mir geworfenen Exception eine EAcccessViolation auf.
    Stellt sich mir jetzt die Frage, mache ich das mit dem Exception werfen richtig?

    #include <stdexcept>
    
    class CBsp
    {
    private:
      char m_cData[100];
    
    public:
      float  GetF32Bit( int iPos ) const
      { 
        if ( iPos < 0 || iPos > 96 ) throw out_of_range("Zugriff außerhalb des Speicherbereichs");
        return *(float*)(m_cData+iPos); 
      }
    }
    

    Und benutzt habe ich es dann folgendermaßen:

    ...
    try{ pBsp->GetF32Bit( x ) }
    catch( out_of_range ){}
    ...
    

    Kann auchsein, dass das wieder am SP2 liegt? Dann glaub ich muss ich das langsam wieder loswerden.



  • Ich bin zwar nicht so gut in C++ aber vielleicht hilft dir das hier.
    Also ich würde das so schreiben, das try and catch (verwende BCB1):

    try
    {pBsp->GetF32Bit( x );}
    catch (...)
    {Application->MessageBox ("out_of_range", "Fehler", 0+16);}



  • Hallo,

    An dem throw catch liegt es wohl nicht, obwohl ich das Abfangen so schreiben würde:
    catch(out_of_range &e)
    {
    }

    Desweiteren würde ich iPos unsigned int machen, so dass der Test auf 0 wegfallen kann. Die AccessViolation kommt wohl wegen etwas anderen. Was soll überhaupt dieses gecaste von char* nach float* ? Mach doch gleich ein Array auf float.



  • @mailer
    Ja klar könnte ich das so schreiben aber ich will in dem Fall ja nur die von mir angestossene Exception abfangen und nicht alle möglichen Exceptions die eventl. an der Stelle mal auftreten. Dafür wird das zusammen mit dem Rest in ein weiteres try, catch gepackt.

    @Braunstein
    ja ganz genau genommen müsste es sogar heißen

    catch(const out_of_range &e)
    

    Aber ich hab das ganze Gefummel mal weggelassen, weil mir nur wichtig war, dass der richtige Typ der Exception abgefangen wird. Das Objekt an sich brauch ich ja nicht, da ich nix mit mache, also nix ausgebe oder so.
    Vielleicht liegts aber genau an dem weglassen?!? Wer weiß.

    Und das gecaste muss leider sein, allerdings mach ich das inzwischen mit reinterpret_cast. Ich hab nämlich ein char Array und muss da aber auch in allen anderen möglichen Datentypen ( float, double, short, long , etc.) drauf zugreifen können.


Anmelden zum Antworten