msg = $a . $b; } } class MyFoo extends Foo { function ping() { throw new Exception("MyFoo::ping() EXCEPTION"); } } class MyFoo2 extends Foo { function ping() { return true; } } class MyFoo3 extends Foo { function ping() { throw new MyException("foo", "bar"); } } # Check that the Exception raised by MyFoo.ping() is returned by # MyFoo.pong(). $ok = 0; $a = new MyFoo(); # TODO: Currently we do not track the dynamic type of returned # objects, so we skip the launder() call. #$b = director_exception::launder($a); $b = $a; try { $b->pong(); } catch (Exception $e) { $ok = 1; check::equal($e->getMessage(), "MyFoo::ping() EXCEPTION", "Unexpected error message #1"); } check::equal($ok, 1, "Got no exception while expected one #1"); # Check that the director can return an exception which requires two # arguments to the constructor, without mangling it. $ok = 0; $a = new MyFoo3(); #$b = director_exception::launder($a); $b = $a; try { $b->pong(); } catch (Exception $e) { $ok = 1; check::equal($e->msg, "foobar", "Unexpected error message #2"); } check::equal($ok, 1, "Got no exception while expected one #2"); try { throw new Exception2(); } catch (Exception2 $e2) { } try { throw new Exception1(); } catch (Exception1 $e1) { } // Check that we can throw exceptions from director methods (this didn't used // to work in all cases, as the exception gets "set" in PHP and the method // then returns PHP NULL, which the directorout template may fail to convert. class Bad extends ReturnAllTypes { function return_int() { throw new Exception("bad int"); } function return_double() { throw new Exception("bad double"); } function return_const_char_star() { throw new Exception("bad const_char_star"); } function return_std_string() { throw new Exception("bad std_string"); } function return_Bar() { throw new Exception("bad Bar"); } } $bad = new Bad(); try { $bad->call_int(); check::fail("Exception wasn't propagated from Bad::return_int()"); } catch (Exception $e) { check::equal($e->getMessage(), "bad int", "propagated exception incorrect"); } try { $bad->call_double(); check::fail("Exception wasn't propagated from Bad::return_double()"); } catch (Exception $e) { check::equal($e->getMessage(), "bad double", "propagated exception incorrect"); } try { $bad->call_const_char_star(); check::fail("Exception wasn't propagated from Bad::return_const_char_star()"); } catch (Exception $e) { check::equal($e->getMessage(), "bad const_char_star", "propagated exception incorrect"); } try { $bad->call_std_string(); check::fail("Exception wasn't propagated from Bad::return_std_string()"); } catch (Exception $e) { check::equal($e->getMessage(), "bad std_string", "propagated exception incorrect"); } try { $bad->call_Bar(); check::fail("Exception wasn't propagated from Bad::return_Bar()"); } catch (Exception $e) { check::equal($e->getMessage(), "bad Bar", "propagated exception incorrect"); } check::done(); ?>