-- -*- mode: eiffel -*- -- $Id: except.se,v 1.2 2001/05/23 18:26:02 doug Exp $ -- http://www.bagley.org/~doug/shootout/ -- from: Friedrich Dominicus -- <LOC-OFF> indexing description: "Eiffel implementation of the Exceptions " "in the shootout examples"; note: "Tested with SmallEiffel and ISE-Eiffel" -- <LOC-ON> class EXCEPT inherit ARGUMENTS creation make feature -- Initialization high: INTEGER; low: INTEGER; high_exception: STRING is "high_exception"; low_exception: STRING is "low_exception"; run_n, outer_i: INTEGER; exc: EXCEPTIONS; make is do create exc; if argument_count /= 1 then io.put_string("exception_test <integer>%N"); exc.die(1); end; if argument(1).is_integer then run_n := argument(1).to_integer; else io.put_string("Argument wasn't an integer, giving up%N"); exc.die(1); end; outer_i := 1; some_fun(run_n); end; some_fun(n: INTEGER) is do from invariant i_in_bounds: outer_i >= 1 and then outer_i <= n + 1; variant really_decreasing: n - outer_i + 1 until outer_i > run_n loop high_fun(outer_i); -- an exception should be raised somwehere below -- `high_fun' in the call chain exc.raise("should not come here%N") -- outer_i := outer_i + 1 end; io.put_string("Exceptions: HI="); io.put_integer(high); io.put_string(" / LO="); io.put_integer(low); io.put_character('%N'); rescue outer_i := outer_i + 1; retry; end; high_fun (i: INTEGER) is do low_fun(i); rescue if exc.developer_exception_name.is_equal(high_exception) then high := high + 1; end end; low_fun (i: INTEGER) is do -- exc.catch(exc.Developer_exception); blow_up(i); rescue if exc.developer_exception_name.is_equal(low_exception) then low := low + 1; end end; blow_up (i : INTEGER) is do if ((i \\ 2) = 0) then exc.raise(low_exception); else exc.raise(high_exception); end; end; end -- class EXCEPT