|
9.1 Ausnahmen
Zwei der wesentlichen Fehlerarten, die bei der Programmierung auftreten,
sind Übersetzungsfehler
und Laufzeitfehler. Im Unterschied
zu anderen Programmier-sprachen muß ein Laufzeitfehler in Ada nicht
unbedingt zum Programmabbruch führen.
In Ada werden bei Laufzeitfehlern Ausnahmen
(Exceptions) ausgelöst. Solche Ausnahmen können an bestimmten
Stellen im Programm abgefangen werden.
Ein Programm liest beispielsweise ein Paar von Zahlen und dividiert diese. Falls
der Divisor "0" ist, tritt ein Laufzeitfehler auf. Bei Ada wird die vordefinierte
Ausnahme Constraint_Error ausgelöst und das Programm wird beendet.
Division durch 0 ohne Ausnahmebehandlung:
-- Dieses Programm muss mit der Übersetzeroption -gnato uebersetzt
-- werden !
with text_io;
procedure Div1 is
Dividend, Divisor, Durchlaeufe : Integer ;
package text_io_int is new Text_io.integer_io (integer);
begin
text_io.put_line ("Bitte probieren Sie eine
0 als Divisor!");
text_io.put_line ("Wieviel Durchlaeufe ?");
text_io_int.get (Durchlaeufe);
for i in 1..Durchlaeufe loop
text_io.put("Geben Sie bitte
den Dividend und den Divisor ein. ");
text_io.new_line;
text_io_int.get(Dividend);
text_io_int.get(Divisor);
text_io.put("Der Quotient
ist ");
text_io_int.put(Dividend / Divisor);
text_io.put(" und der Rest
ist");
text_io_int.put( Dividend rem
Divisor );
end loop;
end Div1; |
Um das Programm stabil gegen diese Art von Fehler zu machen, kann ein Programmierer
den Laufzeitfehler selber behandeln. Wird durch "0" dividiert, so gibt die
Applikation
auf dem Standardausgabegerät eine Fehlermeldung aus. Verantwortlich
für die korrekte Fehlerbearbeitung ist die Ausnahmebehandlung.
-- Dieses Programm muss mit der Übersetzeroption
-gnato uebersetzt werden !
with text_io;
procedure Div2 is
Dividend, Divisor, Durchlaeufe : Integer ;
package text_io_int is new Text_io.integer_io (integer);
begin
text_io.put_line ("Bitte probieren Sie eine
0 als Divisor!");
text_io.put_line ("Programm Division 2");
text_io.put_line ("Wieviel Durchlaeufe ?");
text_io_int.get (Durchlaeufe);
for i in 1..Durchlaeufe loop
text_io.put_line("Geben Sie
bitte den Dividend und den Divisor ein.");
text_io_int.get(Dividend);
text_io_int.get(Divisor);
text_io.put("Der Quotient
ist ");
begin
text_io_int.put(Dividend
/ Divisor);
text_io.put("
und der Rest ist");
text_io_int.put(
Dividend rem Divisor );
text_io.put_line(".");
-- Ausnahmebehandlung:
exception
when CONSTRAINT_ERROR
=>
text_io.new_line(2);
text_io.put_line("Achtung,
der Divisor ist Null.");
end;
end loop;
end Div2; |
|