Глава 6. Завершение и код завершения
. эта часть Bourne shell покрыта мраком, тем не менее все пользуются ею.
Команда exit может использоваться для завершения работы сценария, точно так же как и в программах на языке C. Кроме того, она может возвращать некоторое значение, которое может быть проанализировано вызывающим процессом.
Каждая команда возвращает код завершения (иногда код завершения называют возвращаемым значением ). В случае успеха команда должна возвращать 0 , а в случае ошибки — ненулевое значение, которое, как правило, интерпретируется как код ошибки. Практически все команды и утилиты UNIX возвращают 0 в случае успешного завершения, но имеются и исключения из правил.
Аналогичным образом ведут себя функции, расположенные внутри сценария, и сам сценарий, возвращая код завершения. Код, возвращаемый функцией или сценарием, определяется кодом возврата последней команды. Команде exit можно явно указать код возврата, в виде: exit nnn , где nnn — это код возврата (число в диапазоне 0 — 255 ).
Когда работа сценария завершается командой exit без параметров, то код возврата сценария определяется кодом возврата последней исполненной командой.
Код возврата последней команды хранится в специальной переменной $?. После исполнения кода функции, переменная $? хранит код завершения последней команды, исполненной в функции. Таким способом в Bash передается «значение, возвращаемое» функцией. После завершения работы сценария, код возврата можно получить, обратившись из командной строки к переменной $?, т.е. это будет код возврата последней команды, исполненной в сценарии.
Пример 6-1. завершение / код завершения
Переменная $? особенно полезна, когда необходимо проверить результат исполнения команды (см. Пример 12-27 и Пример 12-13).
Символ !, может выступать как логическое «НЕ» для инверсии кода возврата.
Пример 6-2. Использование символа ! для логической инверсии кода возврата
В отдельных случаях коды возврата должны иметь предопределенные значения и не должны задаваться пользователем.
Процедура Exit
Процедура Exit в Паскале выполняет выход из программы (выход из подпрограммы, выход из процедуры, выход из функции). Синтаксис:
Процедура Exit выполняет выход из текущей подпрограммы и возвращает управление вызвавшей эту подпрограмму программе (или подпрограмме). То есть если вы вызвали подпрограмму ПП из своей программы, а в подпрограмме ПП есть процедура Exit, то подпрограмма ПП будет завершена, и программа продолжит работу.
Если же процедура Exit будет вызвана из программы, то будет завершена программа.
В процедуру Exit можно (но не обязательно) передать параметр Х любого типа (если Exit вызывается в функции). В этом случае, если подпрограмма Exit вызывается в функции, то при вызове Exit вызвавшая её функция вернёт значение Х.
Как выйти из функции
Конечно, вы уже догадались, как выйти из подпрограммы (функции или процедуры). Но на всякий случай поясню подробно.
Итак, вот пример функции, которая использует процедуру Exit:
Здесь мы проверяем переданный в функцию параметр Х. Если он больше или равен 10, то мы вызываем процедуру Exit, которая выполняет выход из функции. То есть код, который находится после Exit, уже не выполняется. И функция (в нашем случае) возвращает FALSE;
Если же Х меньше 10, то процедура Exit не вызывается, и выполняется последняя строка кода, в которой мы результат функции устанавливаем в TRUE.
То есть наша функция проверяет значение Х, и если оно меньше 10, то функция возвращает TRUE. В остальных случаях функция возвращает FALSE.
Как выйти из программы
Точно также можно выйти из программы, если в этом есть необходимость. Если ваша программа, например, обнаруживает какую-то критическую ошибку, которую не может обработать, то можно с помощью процедуры Exit выполнить выход из программы в любом месте.
Пример программы, а также примеры, где можно это использовать, вы можете найти ниже.
Комментарии довольно подробные. Так что всё должно быть понятно.
Здесь для примера есть две функции. Одну мы рассмотрели выше. А другая вызывает процедуру Exit, чтобы не случилось аварийное завершение программы из-за деления на ноль. Здесь также приведён пример использования процедуры Exit с параметром, возвращаемым функцией, которая вызвала процедуру Exit.
Ну и в конце выполняется прерывание программы. То есть последние две строки кода уже не будут выполнены, так как программа завершается с помощью функции Exit.
exit, _exit
void _exit(int status)
Функция exit() вызывает немедленное нормальное завершение программы. Значение параметра status задается вызывающим процессом. По соглашению, если значением параметра status является 0, то предполагается нормальное завершение программы. Ненулевое значение используется для указания ошибки, зависящей от реализации. Также можно использовать макросы EXIT_SUCCESS И EXIT_FAILURE в качестве значения параметра status. Они указывают на нормальное и ненормальное завершение программы соответственно. Вызов функции exit() осуществляет очистку буферов файлов, закрывает все открытые файлы и затем вызывает зарегистрированные с помощью функции atexit() терминальные функции.
Функция _exit() не закрывает каких-либо файлов, не производит очистки буферов и не вызывает функций завершения. Эта функция не определена стандартом ANSI С.
Оператор Exit (Visual Basic) Exit Statement (Visual Basic)
Выходит из процедуры или блока и немедленно передает управление оператору после вызова процедуры или определения блока. Exits a procedure or block and transfers control immediately to the statement following the procedure call or the block definition.
Синтаксис Syntax
Операторы Statements
Exit Do
Немедленно завершает работу цикла Do , в котором он отображается. Immediately exits the Do loop in which it appears. Выполнение продолжится с оператора, следующего за оператором Loop . Execution continues with the statement following the Loop statement. Exit Do можно использовать только в цикле Do . Exit Do can be used only inside a Do loop. При использовании внутри вложенных циклов Do Exit Do выходит из внутреннего цикла и передает управление следующему более высокому уровню вложенности. When used within nested Do loops, Exit Do exits the innermost loop and transfers control to the next higher level of nesting.
Exit For
Немедленно завершает работу цикла For , в котором он отображается. Immediately exits the For loop in which it appears. Выполнение продолжится с оператора, следующего за оператором Next . Execution continues with the statement following the Next statement. Exit For может использоваться только в цикле For . Next или For Each . Next . Exit For can be used only inside a For . Next or For Each . Next loop. При использовании внутри вложенных циклов For Exit For выходит из внутреннего цикла и передает управление следующему более высокому уровню вложенности. When used within nested For loops, Exit For exits the innermost loop and transfers control to the next higher level of nesting.
Exit Function
Немедленно завершает работу процедуры Function , в которой она отображается. Immediately exits the Function procedure in which it appears. Выполнение продолжится с оператора, следующего за инструкцией, вызвавшей процедуру Function . Execution continues with the statement following the statement that called the Function procedure. Exit Function может использоваться только внутри процедуры Function . Exit Function can be used only inside a Function procedure.
Чтобы указать возвращаемое значение, можно присвоить значение имени функции в строке перед оператором Exit Function . To specify a return value, you can assign the value to the function name on a line before the Exit Function statement. Чтобы присвоить возвращаемое значение и выйти из функции в одной инструкции, можно использовать оператор return. To assign the return value and exit the function in one statement, you can instead use the Return Statement.
Exit Property
Немедленно завершает работу процедуры Property , в которой она отображается. Immediately exits the Property procedure in which it appears. Выполнение продолжится с оператора, вызвавшего процедуру Property , то есть с инструкцией, запрашивающей или задавая значение свойства. Execution continues with the statement that called the Property procedure, that is, with the statement requesting or setting the property’s value. Exit Property может использоваться только внутри процедуры свойства Get или Set . Exit Property can be used only inside a property’s Get or Set procedure.
Чтобы указать возвращаемое значение в процедуре Get , можно присвоить значение имени функции в строке перед оператором Exit Property . To specify a return value in a Get procedure, you can assign the value to the function name on a line before the Exit Property statement. Чтобы присвоить возвращаемое значение и выйти из процедуры Get в одном операторе, можно использовать инструкцию Return . To assign the return value and exit the Get procedure in one statement, you can instead use the Return statement.
В процедуре Set Инструкция Exit Property эквивалентна инструкции Return . In a Set procedure, the Exit Property statement is equivalent to the Return statement.
Exit Select
Немедленно завершает работу блока Select Case , в котором он отображается. Immediately exits the Select Case block in which it appears. Выполнение продолжится с оператора, следующего за оператором End Select . Execution continues with the statement following the End Select statement. Exit Select может использоваться только внутри оператора Select Case . Exit Select can be used only inside a Select Case statement.
Exit Sub
Немедленно завершает работу процедуры Sub , в которой она отображается. Immediately exits the Sub procedure in which it appears. Выполнение продолжится с оператора, следующего за инструкцией, вызвавшей процедуру Sub . Execution continues with the statement following the statement that called the Sub procedure. Exit Sub может использоваться только внутри процедуры Sub . Exit Sub can be used only inside a Sub procedure.
В процедуре Sub Инструкция Exit Sub эквивалентна инструкции Return . In a Sub procedure, the Exit Sub statement is equivalent to the Return statement.
Exit Try
Немедленно завершает работу блока Try или Catch , в котором он отображается. Immediately exits the Try or Catch block in which it appears. Выполнение продолжится с блока Finally , если таковой имеется, или с оператором, следующим за оператором End Try в противном случае. Execution continues with the Finally block if there is one, or with the statement following the End Try statement otherwise. Exit Try можно использовать только в блоке Try или Catch , а не в блоке Finally . Exit Try can be used only inside a Try or Catch block, and not inside a Finally block.
Exit While
Немедленно завершает работу цикла While , в котором он отображается. Immediately exits the While loop in which it appears. Выполнение продолжится с оператора, следующего за оператором End While . Execution continues with the statement following the End While statement. Exit While можно использовать только в цикле While . Exit While can be used only inside a While loop. При использовании внутри вложенных циклов While Exit While передает управление циклу, который является одним вложенным уровнем над циклом, где происходит Exit While . When used within nested While loops, Exit While transfers control to the loop that is one nested level above the loop where Exit While occurs.
Примечания Remarks
Не путайте операторы Exit с операторами End . Do not confuse Exit statements with End statements. Exit не определяет конец инструкции. Exit does not define the end of a statement.
Пример Example
В следующем примере условие цикла останавливает цикл, если переменная index больше 100. In the following example, the loop condition stops the loop when the index variable is greater than 100. Однако оператор If в цикле приводит к тому, что оператор Exit Do останавливает цикл, если переменная индекса больше 10. The If statement in the loop, however, causes the Exit Do statement to stop the loop when the index variable is greater than 10.
Пример Example
В следующем примере возвращаемое значение присваивается имени функции myFunction , а затем для возврата из функции используется Exit Function . The following example assigns the return value to the function name myFunction , and then uses Exit Function to return from the function:
Пример Example
В следующем примере оператор return используется для назначения возвращаемого значения и выхода из функции: The following example uses the Return Statement to assign the return value and exit the function:
exit — Выводит сообщение и прекращает выполнение текущего скрипта
(PHP 4, PHP 5, PHP 7)
exit — Выводит сообщение и прекращает выполнение текущего скрипта
Описание
Прекращает выполнение скрипта. Функции отключения и деструкторы объекта будут запущены даже если была вызвана конструкция exit.
exit — это конструкция языка, и она может быть вызвана без круглых скобок если не передается параметр status .
Список параметров
Если параметр status задан в виде строки, то эта функция выведет содержимое status перед выходом.
Если параметр status задан в виде целого числа ( integer ), то это значение будет использовано как статус выхода и не будет выведено. Статусы выхода должны быть в диапазоне от 0 до 254, статус выхода 255 зарезервирован PHP и не должен использоваться. Статус выхода 0 используется для успешного завершения программы.
Замечание: PHP >= 4.2.0 НЕ выведет параметр status если он задан как целое число ( integer ).
Возвращаемые значения
Эта функция не возвращает значения после выполнения.
Примеры
Пример #1 Пример использования exit
= ‘/path/to/data-file’ ;
$file = fopen ( $filename , ‘r’ )
or exit( «Невозможно открыть файл ( $filename )» );
Пример #2 Пример использования exit со статусом выхода
//нормальный выход из программы
exit;
exit();
exit( 0 );
//выход с кодом ошибки
exit( 1 );
exit( 0376 ); //восьмеричный
Пример #3 Функции выключения и деструкторы выполняются независимо
class Foo
<
public function __destruct ()
<
echo ‘Деинициализировать: ‘ . __METHOD__ . ‘()’ . PHP_EOL ;
>
>
function shutdown ()
<
echo ‘Завершить: ‘ . __FUNCTION__ . ‘()’ . PHP_EOL ;
>
$foo = new Foo ();
register_shutdown_function ( ‘shutdown’ );
exit();
echo ‘Эта строка не будет выведена.’ ;
?>
Результат выполнения данного примера:
Примечания
Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций.
Эта языковая конструкция эквивалентна функции die() .
Смотрите также
- register_shutdown_function() — Регистрирует функцию, которая выполнится по завершении работы скрипта
Функции (exit), (quit) и корректный выход из программы на Lispе
Форумы CADUser → Программирование → LISP → Функции (exit), (quit) и корректный выход из программы на Lispе
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Сообщения 5
#1 Тема от Footballist 17 мая 2002г. 09:08:31
- Footballist
- Восстановленный участник
- На форуме с 16 мая 2002г.
- Сообщений: 21
- Спасибо: 0
Тема: Функции (exit), (quit) и корректный выход из программы на Lispе
В процессе работы определенной команды необходимо выдать сообщение и закончить выполнение команды, при использовании функций exit и quit для корректного выхода без сообщения «quit / exit abort» необходимо переопределить функцию *error*, но переопределив ее и вызвав exit или quit мы ее теряем.
Как решить данную проблему?
#2 Ответ от ShaggyDoc 17 мая 2002г. 11:39:42
- ShaggyDoc
- Восстановленный участник
- На форуме с 10 сентября 2001г.
- Сообщений: 1,761
- Спасибо: 0
Re: Функции (exit), (quit) и корректный выход из программы на Lispе
Функция exit и quit созданы в виде «сладкой» парочки, чтобы переопределив одну, выйти из нее с помощью другой.
Программы (на мой взгляд) лучше писать так, чтобы этими функциями не пользоваться, а иметь нормальный логический выход через концовку. А если уж пользоваться (существует и такой стиль), то, перед их применением, восстанавливать функцию *error* и все прочее окружение.
Если делать выход по «естественному» алгоритму, восстановление будет в одной единственной естественной точке выхода. Если выходить через exit (возможно, в нескольких точках) — восстанавливать окружение придется несколько раз.
#3 Ответ от Footballist 17 мая 2002г. 15:01:44
- Footballist
- Восстановленный участник
- На форуме с 16 мая 2002г.
- Сообщений: 21
- Спасибо: 0
Re: Функции (exit), (quit) и корректный выход из программы на Lispе
Так если я восстановлю функцию *error* прямо перед вызовом exit или quit (кстати разницы в них нет или все же есть ?), то всё равно выведется сообщение «quit / exit abort», а что делать, чтобы его не было?
#4 Ответ от Arkady 17 мая 2002г. 23:48:57
- Arkady
- Восстановленный участник
- На форуме с 16 марта 2002г.
- Сообщений: 221
- Спасибо: 0
Re: Функции (exit), (quit) и корректный выход из программы на Lispе
Что то такое?
Всегда восстанавливаю старое значение *error* в конце функции или при вызове exit/quit.
Также использую переменную #DEBUG (setq #GEBUG T) or (setq #DEBUG nil) из командной строки ,когда ,для отладки, не шочу переопределять *error*.
Но вообще то согласен с ShaggyDoc и стараюсь использовать нормальный контролируемый выход.
(defun c:myfunc( / old_err new_err)
(setq old_err *error*)
(defun new_err(msg)
( if (= msg «quit / exit abort»)
(prompt «From My Error Function»)
(prompt (strcat «Error: » msg «\n»))
)
(setq *error* old_err_
)
(if (not #DEBUG) (setq *error* new_err))
(setq *error* old_err)
(princ)
)
#5 Ответ от ShaggyDoc 18 мая 2002г. 12:31:02
- ShaggyDoc
- Восстановленный участник
- На форуме с 10 сентября 2001г.
- Сообщений: 1,761
- Спасибо: 0
Re: Функции (exit), (quit) и корректный выход из программы на Lispе
> footballist
Вот поэтому и не надо доводить дело до использования этих функций (они идентичны), а добиваться естественного завершения программ через концевую точку.
И не надо смотреть на примеры от Автодеска. Они не очень любят вылизывать программы.Могли бы одну функцию сделать с сообщением, а другую без. Но их не смущает лишний вывод сообщений. А у нас люди любят аккуратность. Не ты первый, кого доводят до ярости подобные сообщения.
А вот написать функцию *error* надо с умом. Приведенный Arkady упрощенный типовой пример (он специально упростил) ничего полезного, кроме вывода другого сообщения не делает. А может делать очень много. И использование глобальной «отладочной» переменной очень полезно. Про это целую статью можно написать.
Операторы goto, break, continue и прекращения программы
Оператор безусловного перехода goto
Паскаль является структурным языком программирования. Не смотря на это, в нем присутствует ряд особенностей, которые широко использовались на начальных этапах развития программирования. В те времена идея о том, что программа может рассматриваться как система логически связанных блоков, еще не оформилась. Поэтому, если требовалось изменить линейный ход программы, программисты использовали оператор безусловного перехода goto.
Позже большинство программистов отказались от регулярного использования оператора goto, однако бывают случаи, когда он может быть полезен.
Необходимо знать, что всегда можно обойтись без оператора goto. Его использование затрудняет чтение и понимание программы.
Оператор goto осуществляет переход к оператору, помеченному специальной меткой, которая отделяется от самого оператора двоеточием. В качестве метки может быть использовано любое целое число без знака, содержащее более четырех цифр, или любое имя. Чтобы можно было использовать метку, она должна быть в обязательном порядке объявлена в разделе меток в описательной части программы. Этот раздел начинается служебным словом label, после которого через запятую перечисляются метки.
Чтобы перейти к помеченному оператору, используется оператор перехода, имеющий следующий вид:
Операторы break и continue
Бывает, что цель выполнения цикла достигается раньше, чем он будет прекращен по условию выхода. Так, например, в программе для определения простоты числа цикл будет выполняться n div 2-1 раз, хотя то, что число не является простым, может быть обнаружено на первых шагах цикла. Чтобы уменьшить количество шагов цикла, можно воспользоваться оператором goto, либо сформировать сложное условие выполнения (прекращения) цикла.
Однако существуют специальные операторы, использующиеся для прерывания хода выполнения цикла. Оператор break выполняет полный выход из цикла, т.е. все возможные итерации цикла прерываются. Оператор continue прерывает только текущую итерацию. Break и continue являются процедурами, хотя обычно их называют операторами.
Операторы break и continue выполняются в любом из видов циклов ( repeat, while, for ) и действительны только для внутреннего цикла. Например, если нужно обеспечить принудительный выход из двойного цикла, оператор break должен быть расположен как во внутреннем, так и во внешнем цикле. Операторы break и continue по сути являются видоизмененными операторами goto с известной точкой, в которую осуществляется переход.
В примере у пользователя пять раз запрашивается число только в том случае, если он не вводит ноль.
В примере запрашиваются пять чисел и суммируются только положительные из них.
Принудительное прекращение программы
Обычно программа завершает свою работу по достижении последнего оператора (т.е. при выходе на оператор end с точкой). Если возникает необходимость прекратить выполнение программы где-либо внутри нее, то можно воспользоваться процедурой halt , которая вызывается как отдельный оператор. Эту процедуру можно вызвать, задав в круглых скобках параметр в виде целого неотрицательного числа от 0 до 255. Это значение возвращается в операционную систему в виде кода ошибки (ERRORLEVEL) и может быть проанализирована DOS в случае запуска данной программы из командного файла. Отсутствие параметра в процедуре halt соответствует значению параметра 0 (нормальное завершение программы).
Второй процедурой, с помощью которой можно прекратить выполнение программы, является процедура без параметров exit при ее размещении в исполнимой части программы (а не в теле подпрограммы). Чаще эта процедура применяется для выхода из подпрограммы без прекращения выполнения вызывающей программы.
Прерывание выполнения программы
Скорость выполнения программы
Как ускорить ход выполнение программы ? for a in range(1,1000+1): for b in range(1,1000+1).
Ошибка во время выполнения программы
Задача: Дано действительное положительное число a и целоe число n. Вычислите an. Решение.
Получение статуса выполнения от внешней программы
Всем привет. На работе много конвертирую видео в разные форматы с разными настройками. Для своего.
Как уменьшить время выполнения программы
Помогите сократить время работы этой программы a, b, k = map(int, input().split()) if a > b: .
PyCharm Edu 4.0 нет результата выполнения программы в консоли
Доброе время суток! Начала изучать Python. Для этого поставила себе PyCharm Edu 4.0. Но в.
Я не знаю, что у вас там за приложение, но самое простое, заюзать модуль cmd и прерывать выполнение через обработку KeyboardInterrupt (ctrl-c в любой ОС).
10.05.2020, 18:44 | |||
10.05.2020, 19:48 | 5 | ||
10.05.2020, 20:08 [ТС] | 6 | ||
10.05.2020, 20:57 | 7 | ||
10.05.2020, 21:18 [ТС] | 8 | ||
10.05.2020, 21:38 | 9 | ||
Решение |
|||
10.05.2020, 21:43 [ТС] | 10 | ||
11.05.2020, 00:32 | 11 | ||
Добавлено через 2 часа 48 минут Поэтому есть смысл сделать все немного тоньше, через ивенты:
|