//: C01:Unexpected.cpp
// Z knihy "Myslíme v jazyce C++, část 2" od Bruce Eckela a Chucka Allisona.
// (c) 1995-2004 MindView, Inc. Všechna práva vyhrazena.
// Přečtěte si podmínky používání zdrojových kódů umístěné v souboru 
// 'Licence.txt' dodávaném spolu s balíčkem kódu dostupným na www.MindView.net.
// specifikace výjimek a unexpected(),
//{-msc} (neskončí správně)
#include <exception>
#include <iostream>
using namespace std;

class Nahoru {};
class Vyplnit {};
void g();

void f(int i) throw(Nahoru, Vyplnit) {
  switch(i) {
    case 1: throw Nahoru();
    case 2: throw Vyplnit();
  }
  g();
}

// void g() {}         // Verze 1
void g() { throw 47; } // Verze 2

void my_unexpected() {
  cout << "vyvolána neočekávaná výjimka" << endl;
  exit(0);
}

int main() {
  set_unexpected(my_unexpected); // (Ignorujeme návratovou hodnotu)
  for(int i = 1; i <=3; i++)
    try {
      f(i);
    } catch(Nahoru) {
      cout << "zachyceno Nahoru" << endl;
    } catch(Vyplnit) {
      cout << "zachyceno Vyplnit" << endl;
    }
} ///:~
