Ада 83(только) Как закончить всю программу, которая имеет несколько процедур

Я использую Ada83 (это требование курса для использования этой версии), я использую несколько процедур. Я не знаю, как выйти из всей программы. Что-то вроде Exit в C-программе, которая закрывает всю процедуру. Откуда выход называется?

2 ответа

Решение

Если ваша программа не использует задачи, вы можете определить исключение, которое означает "аварийный выход"; возможно в какой-то упаковке:

package Emergency is
    Emergency_Exit : exception;
end Emergency;

В вашей основной процедуре поймайте это исключение:

procedure Your_Main_Procedure is
begin 
    ... whatever the main procedure does
exception
    when Emergency.Emergency_Exit =>
        null;
end Your_Main_Procedure;

Так что всякий раз, когда вы вызываете исключение где-то в вашей программе:

raise Emergency_Exit;

он передаст управление null оператор, который затем достигнет конца основной процедуры и выйдет из программы.

Это означает, что вы можете добавить код очистки в другие процедуры:

procedure Something_Else is
    ...
begin
    Direct_IO_Instance.Open (Some_File, Direct_IO_Instance.Out_File, "filename");
    begin
        ... do your work
    exception
        when Emergency.Emergency_Exit =>
                -- cleanup 
            Finish_Writing (Some_File);
            Direct_IO_Instance.Close (Some_File);
                -- now reraise, which will eventually reach the end of the program
            raise;
    end;
end Something_Else;

Так когда Emergency_Exit Если он вызван, он в конечном итоге передаст управление в конец основной процедуры, но может прекратить работу других обработчиков исключений по пути выполнения любой необходимой очистки.

Я не думаю, что это работает, если выполняются другие задачи, потому что основная процедура будет ждать завершения этих задач до завершения программы. В этом случае в Аде 83 вам нужно будет согласовать выход с другими задачами; возможно, вы можете определить глобальное логическое значение, которое эти задачи периодически проверяют, чтобы заставить их завершиться, или, возможно, вы можете структурировать программу таким образом, чтобы Emergency_Exit Обработчик исключений знает, какие задачи нужно прервать, или может вызвать запись задачи, чтобы заставить эти задачи завершиться. Лучшее решение будет зависеть от фактической структуры программы.

На этой странице есть некоторые объяснения о том, как это сделать, и каковы риски: http://rosettacode.org/wiki/Program_termination

Другие вопросы по тегам