-- Demonstrates:
--   An exception can be raised from an exception handler

with ada.text_io; use ada.text_io; 
with ada.integer_text_io; use ada.integer_text_io; 

with ada.exceptions; use ada.exceptions;
 
procedure excep4  is 
    Invalid_Data: Exception;
    subtype Small_Even is Integer range Integer'First .. 1_000
        with dynamic_predicate => Small_Even mod 2 = 0;
    n: Small_Even;
begin
    loop
        put("Enter an even number less than 1000, negative to quit:");
        begin
            get(n);
        exception
            when data_error => 
                put_line("Must enter a number");
                raise Invalid_Data;
            when constraint_error => 
                put_line("Number must be even and less than 1,000");
                raise Invalid_Data;
        end;
        exit when n < 0;
        put_line(n'img);
    end loop;
exception
    when e: Invalid_Data =>
        put("Program halted because of invalid data.");
    when e: Others =>
        put("Something unexpected happened!  ");
        put(exception_name(e));
        put(exception_message(e));
end  excep4;