LINUX.ORG.RU

«Код ошибки», «код возврата» и миллион терминов

 , ,


0

1

Не понимаю, есть ли серьезная разница между кодом ошибки и кодом возврата.

Думал, что в баше есть только один термин- return value, который означает что программа возвращает по завершению: 0, 1 и т.д.

Но тут зашел в вики, и там куча статей по программированию и возвращаемым штукам.

  1. error code

  2. return value

  3. return code

  4. return status

  5. exit code

  6. result code

Есть ли хоть какая-то разница, едрить его налево? Есть ли смысл париться?

Ответ на: комментарий от shkolnik_2022

Это несущественный вопрос, на самом деле.

Гораздо важнее тебе знать, что твоя программа в любом случае такие коды обязана возвращать родительскому процессу.

LongLiveUbuntu ★★★★★ ()

return value то есть вернуть значение. Само значение же может быть и интерпретироваться тобой как угодно. Как ошибка как данные как код возврата. Это просто данные и от их значения зависит кто они и что они.

LINUX-ORG-RU ★★ ()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от shkolnik_2022

Все в ходу, но ИМХО самые толковые возвращаемое значение, код возврата и код ошибки.

Но я не согласен что они все синонимы, т.к. возвращаемое значение - это чаще всё-таки вычисляемое значение, т.е. оно может являтся самой целью вызова функции, например функция возвращающся синус(её возвращаемое значение это как раз синус переданного ей аргумента), хотя по сути всё что вернёт функция или программа - возвращаемое значение

в то же время код возврата - это некоторое значение определяющее статус выполнения, если функция или программа отрботала успешно и без ошибок, то она вернёт один код, если произошла ошибка то вернёт код ошибки, например так работают функции открытия файла может в случае успеха вернуть номер файлового дескриптора, а в случае неудачи вернуть код ошибки.

В целом return code = return status = result code.

exit code это то же самое только не для функций в программе, а для самой программы

AKonia ()
Последнее исправление: AKonia (всего исправлений: 2)
Ответ на: комментарий от AKonia

Вот и я с самого начала почувствовал некую разницу.

return value - тут может быть любое возвращаемое значение: цифра, строка, массив, код ошибки. Хотя конкретно в баше (из руководства) это вроде как только возвращаемый статус при завершении программы.

return [n]

Cause a shell function to stop executing and return the value n to its caller. If n is not supplied, the return value is the exit status of the last command executed in the function.

Правда не понял в чем разница с exit. Вроде похожее делает.

А вот другие термины в программировании.

return code - тут понятно из названия, что конкретно какой-то код возвращает (необязательно код ошибки, наверно, ведь 0 - это код успешного завершения).

error code - тут сразу ясно, что речь о коде ошибки. Вроде как если вернула 0, это return code, а если вернула отличное от 0, то это уже error code.

Хотя в контексте баша все является return value, как я понял.

shkolnik_2022 ()
Ответ на: комментарий от AKonia

А вот вижу ты дописал.

exit code это то же самое только не для функций в программе, а для самой программы

Да, exit я уже использовал, он прерывал весь скрипт. А return получается может прервать какой-то конкретный if или цикл, или другой блок программы, а дальше будет исполняться следующий?

shkolnik_2022 ()

А теперь открой для себя и потоки вывода... Если что он не один, хотя в Linux-е любят один использовать для всего.

peregrine ★★★★★ ()
Ответ на: комментарий от shkolnik_2022

exit делает быстрый выход и отличается от return тогда, когда вы хотите немедленно прервать работу и вернуть код ошибки, return же просто вернёт управление в вызвающую функцию. Некоторая эквивалентность имеет место только в плане взаимозаменяемости return и exit в функции main, но и то только на первый взгляд, т.к. даже main в случае с return передаст сначала управление вызвавшей её функции start, а в случае c++ также будет пытаться вызвать деструкторы.

error code это тоже return code, в том смысле что return code это любой код возврата, как успех, так и ошибка(error code).

Тут не от контекста баш или не баш зависит, а от роли того что и при каких условиях вы возращаете. По сути всё что возвращаете с return это возвращаемое значение, если это значение отражает корректность выполнения программы(а не вычисленное значение), то это код возврата, если в программе произошло, то, что мешает работе программы, то в качестве кода возврата можно вернуть код ошибки(обычно коды ошибки разные, например не удалось выделить память - один код, не получилось открыть файл - другой), если ошибки непоправимые, то логичнее завершить работу программы(в т.ч. это касается и баша, например exit может вызвать сценарий на баше, результат работы которого вы хотели бы знать) и вернуть exit code

AKonia ()
Ответ на: комментарий от shkolnik_2022

нет, будет передано управление в функцию, которая вызвала текущую(из которой ты сделал return), т.е. она прервёт не for или if, а всю функцию или даже сценарий(когда например фунция вызвана из оболочки). Для прерывания for/if есть break и continue

AKonia ()
Последнее исправление: AKonia (всего исправлений: 1)

Есть ли хоть какая-то разница, едрить его налево?

нет

Есть ли смысл париться?

Если будешь сам писать, то пиши каноничное return value. Будет тебе уважение.

imul ★★★★★ ()
Ответ на: комментарий от LongLiveUbuntu

Скажи пожалуйста, что изображенно на твоей аве? Не могу понять

LGH ()
Ответ на: комментарий от AKonia

[i]

даже main в случае с return передаст сначала управление вызвавшей её функции start, а в случае c++ также будет пытаться вызвать деструкторы.

[/i]

Пожалуйста объясните…. вот тут я не понял. Какой конструктор?

Что такое стековый фрейм знаем? Знаем как происходит возврат в фукциях Си?

LGH ()
Ответ на: комментарий от LGH

Знаем. Встречный вопрос: то что выполнение начинается не с main знаем ? Знаем ли, что в всё, что вызвается перед main не может содержать большинства плюсовых плюшек ?

AKonia ()

Правильно говорить exit code. Хотя чаще всего он используется для возврата кода ошибки при некорректной работе программы, эти совсем не обязательно.

Legioner ★★★★★ ()
Ответ на: комментарий от AKonia

Это я не знаю… объясните пожалуйста, причем тут конструктор, и с чего начинается выполнение, если не с main. Конечно же каждая фукция должна быть чем то вызвана. Чем вызывается main? Я не дое…ваюсь, просто я хочу знать, мне интересно понимать новое

LGH ()
Ответ на: комментарий от LGH

main - самая обычная функция, которая всё так же вызывается, только её отличие в тому, что вызывается она не вами, а само выполнение начинается с функции start(или entry0)(которая настраивает различные плюшки Си++, подготавливает параметры argc, argv для полной версии ф-ии main и делает ещё много чего полезного), которую можете в дизассемблере посмотреть, в целом она настраивает среду, вызвает функции-конструкторы(которые не могут кстати содержать Си++ кода, только Си или ассемблер, эти функции вы можете определить сколько угодно сами, для этого нужно для такой функции указывать соотв аттрибут), затем передаёт управление main - давая отработать непосредственно вашей программе, а затем деструкторы(для них в целом верно всё то же самое, что и для конструкторов). На самом деле до entry0 тоже могут быть функции зачинатели, но это больше от среды и компилятора зависит, как правило start(или entry0) присутствует практически везде, за подробностями я рекомендую посмотреть дизассемблер того же Hello World, например entry0

AKonia ()
Последнее исправление: AKonia (всего исправлений: 2)
Ответ на: комментарий от AKonia

Стопэ.

А если делаю так

.section .text
global main
main:




mov $1, %eax


Точка входа в программу будем метка main

LGH ()
Ответ на: комментарий от LGH

Когда дисасемблирую код Си, точка входа в программу, также main…. То есть с этой метки и начнется выполнение.

LGH ()
Ответ на: комментарий от LGH

Да, только теперь это не Си, а ассемблер, про который я уже писал что у него точка входа там, где захочет программист, для Си нужно слегка удобрить почву

AKonia ()
Ответ на: комментарий от LGH

Без проблем, дизассемблируйте, но я вам же показал дизассм от тривиального HW и точка входа…. не main, а вход в main как раз происходит из entry0

AKonia ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей