//package everything;

public class Jongleur {
	private static boolean MAYBE = true;

	private static void log(String msg) {
		System.out.println(msg);
	}

	public static void main(String[] args) {
		try {
			log("main > m1");
			m1();
			log("main < m1");
		}
		catch(E1 e) {
			log("main <--- E1");
		}
		catch(E2 e) {
			log("main <--- E");
		}
		finally {
			log("geschafft");
		}
	}

	public static void m1() throws E1, E2 {
		try {
			log("m1 > m2");
			m2();
			log("m1 < m2");
		}
		catch(E1 e) {
			log("m1 <--- E1");
			throw e;
		}
		catch(E e) {
			log("m1 <--- E");
		}
		finally {
			MAYBE = !MAYBE;
			log("m1 finally /" + MAYBE);
			try {
				log("m1 > m2");
				m2();
				log("m1 < m2");
			}
			catch(E11 e) {
				log("m1 <--- E11");
			}
			catch(E e) {
				log("m1 <--- E");
			}
		}
	}

	public static void m2() throws E {
		try {
			if(MAYBE) {
				throw new E1();
			}
			else {
				throw new E2();
			}
		}
		catch(E e) {
			log("m2 <--- E");
			throw e;
		}
		finally {
			log("m2 finally /" + MAYBE);
			throw new E11();
		}
	}

	public static class E extends Exception { { log("E()"); } }
	public static class E1 extends E { { log("E1()"); } }
	public static class E2 extends E { { log("E2()"); } }
	public static class E11 extends E { { log("E11()"); } }
}
