Obsługa wyjątków.

0

Jak rzucić couta, żeby został on przechwycony przez blok:

catch (std::ostream& OStrm) {
     cout << "Obsluga: 1" << endl;
   }

???

0
try {
   throw &cout;
}
catch (std::ostream *OStrm) {
   (*OStrm) << "Obsluga: 1" << endl;
}

Strasznie dziwne ... wręcz WTF. Raczej zrezygnuj z takich zabiegów. Dlaczego niby strumień miałby robić za wyjątek ? Wyjątki nie służą do implementacji logiki.

0

Wiem, że dziwne, ale nie za bardzo znam się na obsłudze wyjątków, a wiem, że na egzaminie z programowania obiektowego mogę mieć pytanie:

Niech bedzie dany nastepujacy fragment kodu

 int main()
 {
   try {
     throw std::cout;
   }
   catch (std::ostream& OStrm) {
     cout << "Obsluga: 1" << endl;
   }
   catch (std::istream& OStrm) {
     cout << "Obsluga: 2" << endl;
   }
 }

Czy prawda jest, ze ...

  1. zapis jest niepoprawny, gdyz nie mozna zglaszac jako wyjatkow obiektow z biblioteki standardowej.
    NIE?

  2. zapis jest niepoprawny, gdyz strumieni nie mozna przekazywac
    do metod poprzez wartosc.
    NIE?

  3. zapis jest niepoprawny, gdyz jako wyjatku nie mozna zglaszac
    w jakiejkolwiek formie strumienia standardowego, tzn. bezposrednio
    jako obiekt lub posrednio poprzez zmienne referencjna lub wskaznik.
    TAK?

  4. mozliwa jest modyfikacja zgloszenia obiektu std::cout bez wprowadzania dodatkowych definicji klas, tak aby ktoras z istniejacych sekcji "catch" przechwycila go.
    NIE?

0
jj09 napisał(a)

Wiem, że dziwne, ale nie za bardzo znam się na obsłudze wyjątków, a wiem, że na egzaminie z programowania obiektowego mogę mieć pytanie:

Niech bedzie dany nastepujacy fragment kodu

 int main()
 {
   try {
     throw std::cout;
   }
   catch (std::ostream& OStrm) {
     cout << "Obsluga: 1" << endl;
   }
   catch (std::istream& OStrm) {
     cout << "Obsluga: 2" << endl;
   }
 }

Czy prawda jest, ze ...

  1. zapis jest niepoprawny, gdyz nie mozna zglaszac jako wyjatkow obiektow z biblioteki standardowej.
    NIE?

  2. zapis jest niepoprawny, gdyz strumieni nie mozna przekazywac
    do metod poprzez wartosc.
    NIE?

  3. zapis jest niepoprawny, gdyz jako wyjatku nie mozna zglaszac
    w jakiejkolwiek formie strumienia standardowego, tzn. bezposrednio
    jako obiekt lub posrednio poprzez zmienne referencjna lub wskaznik.
    TAK?

  4. mozliwa jest modyfikacja zgloszenia obiektu std::cout bez wprowadzania dodatkowych definicji klas, tak aby ktoras z istniejacych sekcji "catch" przechwycila go.
    NIE?

To jest niepoprawne bo strumieni nie można kopiować:

 private: ios_base (const ios_base&); //konstruktor kopiujący w ios_base

1 - nie (można), 2 - tak, 3 - nie, 4 - jako wartość nie, jako adres - tak

#include <iostream>

int main()
 {
   try {
     throw &std::cout;
   }
   catch (std::ostream *OStrm) {
     std::cout << "Obsluga: 1" << std::endl;
   }
   catch (std::istream& OStrm) {
     std::cout << "Obsluga: 2" << std::endl;
   }
 }

d:/kody $ g++ -o wtf.exe wtf.cpp
d:/kody $ ./wtf.exe
Obsluga: 1

0

dzięki bodziobudowniczy;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1