//: C01:BadException.cpp {-bor}
// 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.
#include <exception>    // kvůli std::bad_exception
#include <iostream>
#include <cstdio>
using namespace std;

// třídy výjimek
class A {};
class B {};

// vlastní funkce terminate()
void my_thandler() {
  cout << "voláno terminate()" << endl;
  exit(0);
}

// vlastní správci neočekávaných výjimek
void my_uhandler1() { throw A(); }
void my_uhandler2() { throw; }

// Pokud bychom přidali konstrukci throw do f nebo g
// překladač by poznal narušení a ohlásil by chybu.
// Proto ji dáme do vlastní funkce
void t() { throw B(); }

void f() throw(A) { t(); }
void g() throw(A, bad_exception) { t(); }

int main() {
  set_terminate(my_thandler);
  set_unexpected(my_uhandler1);
  try {
    f();
  } catch(A&) {
    cout << "zachyceno A z f" << endl;
  }
  set_unexpected(my_uhandler2);
  try {
    g();
  } catch(bad_exception&) {
    cout << "zachyceno bad_exception z g" << endl;
  }
  try {
    f();
  } catch(...) {
    cout << "Tohle se nikdy nevytiskne" << endl;
  }
} ///:~
