Ausgabe verkuerzbar?



  • Hallo,

    kann mir jemand sagen, ob man die Fehlermeldung

    stringstream ss;
    ss << "trying to remove sequence " << idx << " of subtype " << subtype << " which has " << seqs_of_target_sub.size() << " sequences";
    throw ss.str();
    

    irgendwie verkuerzen kann (hierbei sind idx, subtype und seqs_of_target_sub.size() alles Build-in-Types)?

    Mein Problem ist hier, dass man nicht einfach die << durch + ersetzen kann und das Ganze in einem String speichern.



  • Mit ss.str(); kriegst du ja deinen string.. Wo ist genau das Problem?


  • Administrator

    Boost.Format
    Oder strukturiere deinen Code über mehrere Zeilen:

    ss << "trying to remove sequence "
       << idx
       << " of subtype "
       << subtype
       << " which has "
       << seqs_of_target_sub.size()
       << " sequences";
    

    Nicht unbedingt kürzer, aber dafür lesbarer.

    Im übrigen, das Ersetzen von << durch + würde die Sache ja nicht wirklich verkürzen. 😉

    Edit: Oder am besten die Idee von BBBB gleich nach meinem Beitrag. Hatte das throw gar nicht gesehen. Man wirft keine Fehlernachrichten, sondern Fehler mit Informationen, woraus man dann Fehlernachrichten erstellen kann.

    Grüssli



  • ingobulla schrieb:

    Hallo,

    kann mir jemand sagen, ob man die Fehlermeldung

    stringstream ss;
    ss << "trying to remove sequence " << idx << " of subtype " << subtype << " which has " << seqs_of_target_sub.size() << " sequences";
    throw ss.str();
    

    irgendwie verkuerzen kann (hierbei sind idx, subtype und seqs_of_target_sub.size() alles Build-in-Types)?

    Mein Problem ist hier, dass man nicht einfach die << durch + ersetzen kann und das Ganze in einem String speichern.

    Schreib dir eine vernünftige Exception-Klasse!



  • Woran ich gedacht habe war:

    throw "trying to remove sequence " + idx + " of subtype " + subtype + " which has " + seqs_of_target_sub.size() + " sequences";
    

    Das geht so aber ja nicht und ich war mich am fragen, ob es einen Workaround gibt, um es trotzdem als Einzeiler hinzukriegen.



  • ingobulla schrieb:

    Woran ich gedacht habe war:

    throw "trying to remove sequence " + idx + " of subtype " + subtype + " which has " + seqs_of_target_sub.size() + " sequences";
    

    Das geht so aber ja nicht und ich war mich am fragen, ob es einen Workaround gibt, um es trotzdem als Einzeiler hinzukriegen.

    Mit Gewalt so?

    throw (stringstream()<< "trying to remove sequence " << idx << " of subtype " << subtype << " which has " << seqs_of_target_sub.size() << " sequences").str();
    

  • Administrator

    ingobulla schrieb:

    Woran ich gedacht habe war:

    throw "trying to remove sequence " + idx + " of subtype " + subtype + " which has " + seqs_of_target_sub.size() + " sequences";
    

    Das geht so aber ja nicht und ich war mich am fragen, ob es einen Workaround gibt, um es trotzdem als Einzeiler hinzukriegen.

    Frage: Wozu? 😕

    Zudem, wie BBBB es gesagt hat, mach dir eine vernünftige Exceptionklasse. Das Werfen eines Fehlers und das Erstellen einer Fehlermeldung sind zwei verschiedene Dinge. Dort wo man einen Fehler wirft, erstellt man keine Fehlermeldung. Die Fehlermeldung entsteht frühestens dort, wo man den Fehler behandelt.

    Grüssli



  • volkard schrieb:

    Mit Gewalt so?

    throw (stringstream()<< "trying to remove sequence " << idx << " of subtype " << subtype << " which has " << seqs_of_target_sub.size() << " sequences").str();
    

    Gewalt ist in dem Fall ok, Groesse und Einsatzzweck des Programms lassen mir die Verwendung von Exceptionn-Klassen in diesem Fall entbehrlich erscheinen.

    Allerdings liefert

    throw (stringstream()<< "trying to remove sequence " << idx << " of subtype " << subtype << " which has " << seqs_of_target_sub.size() << " sequences").str();
    

    die Fehlermeldung

    SubtypeMap.cpp:169: Fehler: »struct std::basic_ostream<char, std::char_traits<char> >« hat kein Element namens »str«
    

    und

    throw (stringstream()<< "trying to remove sequence " << idx << " of subtype " << subtype << " which has " << seqs_of_target_sub.size() << " sequences");
    

    die Fehlermeldung

    /usr/include/c++/4.3/bits/ios_base.h: In copy constructor »std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)«:
    /usr/include/c++/4.3/bits/ios_base.h:782: Fehler: »std::ios_base::ios_base(const std::ios_base&)« ist privat
    /usr/include/c++/4.3/iosfwd:52: Fehler: in diesem Zusammenhang
    /usr/include/c++/4.3/iosfwd: In copy constructor »std::basic_ostream<char, std::char_traits<char> >::basic_ostream(const std::basic_ostream<char, std::char_traits<char> >&)«:
    /usr/include/c++/4.3/iosfwd:61: Anmerkung: künstlich erzeugte Methode »std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)« zuerst hier erfordert 
    SubtypeMap.cpp: In static member function »static bool SubtypeMap::remove_sequence(const char&, unsigned int)«:
    SubtypeMap.cpp:169: Anmerkung: künstlich erzeugte Methode »std::basic_ostream<char, std::char_traits<char> >::basic_ostream(const std::basic_ostream<char, std::char_traits<char> >&)« zuerst hier erfordert
    


  • BBBB schrieb:

    Schreib dir eine vernünftige Exception-Klasse!



  • vor langer zeit schrieb ich sowas:

    void throw_funny_exception(int idx,char const* suty,int cnt){
    	ostringstream oss;
    	oss << "trying to remove sequence " << 5 << " of subtype " << "suty" << " which has " << 8 << " sequences";
    	throw oss.str();
    }
    


  • ingobulla schrieb:

    Allerdings liefert

    throw (stringstream()<< "trying to remove sequence " << idx << " of subtype " << subtype << " which has " << seqs_of_target_sub.size() << " sequences").str();
    

    die Fehlermeldung

    SubtypeMap.cpp:169: Fehler: »struct std::basic_ostream<char, std::char_traits<char> >« hat kein Element namens »str«
    

    Die op<< liefern eine ostream-Referenz auf den stringstream. ostreams haben aber keine str()-methode. daher musst du dann noch casten:

    throw static_cast<stringstream&>(stringstream()<< "trying to remove sequence " << idx << " of subtype " << subtype << " which has " << seqs_of_target_sub.size() << " sequences").str();
    

    *schauder*

    Du könntest folgende kleine Klasse nehmen:

    class streamlike_exception : public std::exception
    {
    public:
      streamlike_exception()
        : osstr() {}
      streamlike_exception (const std::exception& other)
        : osstr(other.what()) {}
      streamlike_exception(std::string const& s) 
        : osstr(s) {}
      streamlike_exception& operator= (const streamlike_exception& that) throw()
      {
        osstr.str(other.osstr.str());
        return *this;
      }
      virtual ~streamlike_exception() {}
      virtual const char* what() const
      {
        return osstr.str().c_str();
      }
      template <typename T>
      streamlike_exception& operator<< (T const& t)
      { osstr << t; return *this; }
    private:
       std::ostringstream osstr;
    };
    
    void foo()
    {
      throw streamlike_exception("trying to remove sequence ") << idx << " of subtype " << subtype << " which has " << seqs_of_target_sub.size() << " sequences";
    }
    

    hat den Vorteil dass es eben eine "richtige" std::exception ist und kein umhergeworfener string 😉


Anmelden zum Antworten