Как завершить программу в с в середине кода

Я хотел бы, чтобы мой код C ++ прекратил работать, если соблюдено определенное условие, но я не уверен, как это сделать. Так что просто в любой момент, если if утверждение верно, завершить код следующим образом:

if (x==1)

Решение

Есть несколько способов, но сначала вы должны понять, почему очистка объекта важна, и, следовательно, причина std::exit является маргинальным среди программистов C ++.

RAII и разматывание стека

C ++ использует идиому под названием RAII , что в простых терминах означает, что объекты должны выполнять инициализацию в конструкторе и очистку в деструкторе. Например, std::ofstream class [может] открыть файл во время конструктора, затем пользователь выполняет над ним операции вывода и, наконец, в конце своего жизненного цикла, обычно определяемого областью действия, вызывается деструктор, который по существу закрывает файл и очищает любое записанное содержимое. в диск.

Что произойдет, если вы не дойдете до деструктора, чтобы очистить и закрыть файл? Кто знает! Но, возможно, он не запишет все данные, которые он должен был записать в файл.

Урок №5 по NC Studio. Восстановление выполнения программы после сбоя

Например, рассмотрим этот код

#include #include #include void inner_mad() < throw std::exception(); >void mad() < std::unique_ptrptr(new int); inner_mad(); > int main() < std::ofstream os(«file.txt»); os

Что происходит в каждой возможности:

  • Возможность 1: Возврат по сути оставляет текущую область действия функции, поэтому он знает о конце жизненного цикла os таким образом вызывая его деструктор и делая правильную очистку, закрывая и сбрасывая файл на диск.
  • Возможность 2: Создание исключения также заботится о жизненном цикле объектов в текущей области видимости, таким образом делая надлежащую очистку …
  • Возможность 3: Здесь вступает в действие раскрутка стека! Даже если исключение inner_mad , размотчик пойдет через стек mad а также main чтобы выполнить надлежащую очистку, все объекты будут уничтожены должным образом, в том числе ptr а также os ,
  • Возможность 4: Ну вот? exit является функцией C, и она не знает и не совместима с идиомами C ++. Это не выполнять уборку на ваших объектах, в том числе os в том же объеме. Таким образом, ваш файл не будет закрыт должным образом, и по этой причине содержимое может никогда не быть записано в него!
  • Другие возможности: Это просто оставит основной объем, выполняя неявное return 0 и, таким образом, имеет тот же эффект, что и возможность 1, то есть надлежащая очистка.

Но не будьте настолько уверены в том, что я только что сказал вам (в основном, варианты 2 и 3); продолжайте чтение, и мы узнаем, как выполнить правильную очистку на основе исключений.

Возможные способы Конец

Вернись с главной!

Вы должны делать это, когда это возможно; всегда предпочитайте возвращаться из вашей программы, возвращая правильный статус выхода из основного.

Вызывающий вашу программу и, возможно, операционная система, возможно, захотят узнать, успешно ли была сделана ваша программа или нет. По этой же причине вы должны вернуть либо ноль, либо EXIT_SUCCESS сигнализировать об успешном завершении программы и EXIT_FAILURE чтобы сообщить о неудачном завершении программы, любая другая форма возвращаемого значения определяется реализацией (§18.5 / 8).

NC Studio: Как запустить с определенной строки выполнение программы

Однако вы можете быть очень глубоко в стеке вызовов, и возвращение всего этого может быть болезненным …

[Не] бросить исключение

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

Но вот подвох! Это определяется реализацией, выполняется ли разматывание стека, когда выброшенное исключение не обрабатывается (по предложению catch (…)) или даже если у вас есть noexcept функция в середине стека вызовов. Это указано в §15.5.1 [кроме окончательного]:

    В некоторых ситуациях обработка исключений должна быть прекращена для менее тонких методов обработки ошибок. [Примечание: эти ситуации: […] — когда механизм обработки исключений не может найти обработчик для брошенного исключения (15.3), или когда поиск обработчика (15.3) встречает самый внешний блок функции с noexcept -Спецификация что не допускает исключения (15.4) или […] […]

Таким образом, мы должны поймать это!

Сделайте исключение и поймайте его на главном!

Поскольку неперехваченные исключения могут не выполнять разматывание стека (и, следовательно, не будет выполнять надлежащую очистку), мы должны перехватить исключение в main и затем вернуть статус выхода ( EXIT_SUCCESS или же EXIT_FAILURE ).

Так что, возможно, хорошей настройкой будет:

int main() < /* . */ try < // Insert code that will return by throwing a exception. >catch(const std::exception // throws. A good idea might be a `return_exception`. return EXIT_FAILURE; >/* . */ >

[Не] STD :: выход

Это не выполняет разматывание стека, и ни один живой объект в стеке не вызовет соответствующий деструктор для очистки.

Это применяется в §3.6.1 / 4 [basic.start.init]:

Завершение программы без выхода из текущего блока (например, путем вызова функции std :: exit (int) (18.5)) не уничтожает объекты с автоматическим хранением (12.4).. Если std :: exit вызывается для завершения программы во время уничтожения объекта со статическим или потоковым хранением, программа имеет неопределенное поведение.

Подумай об этом сейчас, зачем ты это делаешь? Сколько предметов ты болезненно повредил?

Другие [как плохие] альтернативы

Есть другие способы прекратить программу (кроме сбоев), но они не рекомендуются. Просто для пояснения они будут представлены здесь. Обратите внимание, как нормальное завершение программы не средняя размотка стека, но Хорошо состояние для операционной системы.

  • std::_Exit вызывает нормальное завершение программы, и все тут.
  • std::quick_exit вызывает нормальное завершение программы и вызывает std::at_quick_exit обработчики, никакой другой очистки не выполняется.
  • std::exit вызывает нормальное завершение программы, а затем вызывает std::atexit обработчики. Выполняются другие виды очистки, такие как вызов деструкторов статических объектов.
  • std::abort вызывает аварийное завершение программы, очистка не выполняется. Это следует вызывать, если программа завершена действительно, действительно неожиданным способом. Это ничего не даст, кроме как сигнализировать ОС об аварийном завершении. Некоторые системы выполняют дамп ядра в этом случае.
  • std::terminate вызывает std::terminate_handler какие звонки std::abort по умолчанию.
Читайте также:
Текстовые программы для компьютера список

Другие решения

Как отметил Мартин Йорк, exit не выполняет необходимую очистку, как return.

Всегда лучше использовать возврат в месте выхода.
В случае, если вы не в основном, где бы вы хотели выйти из программы, сначала вернитесь в главное.

Рассмотрим приведенный ниже пример.
С помощью следующей программы будет создан файл с указанным содержимым.
Но если возвращение прокомментировано ofstream os(«out.txt»); os

Не только это: наличие нескольких точек выхода в программе усложнит отладку.
Используйте выход только тогда, когда это может быть оправдано.

Люди говорят «вызов выхода (код возврата)», но это дурной тон. В небольших программах это нормально, но есть ряд проблем с этим:

  1. Вы получите несколько точек выхода из программы.
  2. Это делает код более запутанным (как при использовании goto)
  3. Он не может освободить память, выделенную во время выполнения

Действительно, единственный раз, когда вы должны выйти из проблемы, с этой строкой в ​​main.cpp:

return 0;

Если вы используете exit () для обработки ошибок, вы должны узнать об исключениях (и вложенных исключениях) как о гораздо более элегантном и безопасном методе.

return 0; положи это куда хочешь в пределах int main() и программа сразу закроется.

Либо вернуть значение из вашего main или используйте exit функция. Оба принимают Int. Неважно, какое значение вы возвращаете, если только у вас нет внешнего процесса, отслеживающего возвращаемое значение.

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

Чтобы прекратить его до этого момента, вы можете использовать функцию выхода (int status), где status — это значение, возвращаемое тому, что запустило программу. 0 обычно указывает на состояние без ошибок

Если у вас есть ошибка где-то глубоко в коде, то либо сгенерируйте исключение, либо установите код ошибки. Всегда лучше генерировать исключение вместо установки кодов ошибок.

Источник: web-answers.ru

Остановить поток программы в середине без использования исключения

Мне нужно остановить поток программы посередине, и в настоящее время я использую для этого исключение. Этот поток является законным потоком, и я хочу знать, могу ли я сделать это без использования исключения. Это пример моего кода, и я не могу изменить func_2 и func_1 :

#include «stdio.h» void func_3() < printf(«i am func_3n»); throw 20; printf(«i am not supposed to be heren»); >void func_2() < printf(«i am func_2n»); func_3(); printf(«i am not supposed to be heren»); >void func_1() < printf(«i am func_1n»); func_2(); printf(«i am not supposed to be heren»); >int main() < try < func_1(); >catch (int e) < printf(«i am supposed to be heren»); >catch (. ) < printf(«i am not supposed to be heren»); >>
user3872616 24 июль 2014, в 14:22
Поделиться
Как насчет return; ?
JBentley 24 июль 2014, в 11:37
Попробуйте это: int * i = 0; * I = 20;

Kieveli 24 июль 2014, в 11:39
leemes 24 июль 2014, в 11:39
Вы можете попробовать setjmp и longjmp
cup 24 июль 2014, в 11:40
Это слишком не по контексту, чтобы дать полезный общий ответ.
Kerrek SB 24 июль 2014, в 11:40

setjmp/longjmp но это только более уродливая версия исключений. Что не так с использованием здесь исключения, этот тип потока — это именно то, для чего они предназначены . Если, конечно, вы действительно не хотите exit .

Marc Glisse 24 июль 2014, в 11:40
JBentley 24 июль 2014, в 11:43

Я настоятельно не рекомендую неправильно использовать исключения для управления логикой программы. Используйте их для обработки исключительных ситуаций (например, ошибок, которые невозможно исправить в вашей реальной точке).

πάντα ῥεῖ 24 июль 2014, в 11:55

Я не хочу выходить из потока, и я пытаюсь найти другие решения помимо исключений — но на основе ответов я понимаю, что исключения — лучшее решение.

user3872616 27 июль 2014, в 14:18
Показать ещё 7 комментариев
Поделиться:

3 ответа

Я предполагаю, что вы хотите справиться с исключительным случаем и ищете альтернативу исключениям. Т.е. я надеюсь, что вы не захотите продолжать программу «нормально» после обработки вашего исключительного случая, что возможно, но не рекомендуется применять с исключениями.

Возможные, но не рекомендуемые альтернативы исключениям:

  • Когда вы хотите остановить все свое приложение, вы можете использовать std::exit(0); , Вы можете реализовать свой «catch» -code в функции, которую вы вызываете вместо «throw» -statement, и вызывать std::exit(0); в конце этой функции (или используйте другой код выхода, чтобы указать «неудачный» выход). Или вы реализуете обработчик выхода и регистрируете его с помощью std::atexit( , Альтернатива std::exit(); abort(); который выдает сигнал POSIX «SIGABRT» для указания аномального завершения (что является поведением по умолчанию, если ваша программа выбрасывает и не вызывает исключения). Затем ваш «catch» -code перейдет в обработчик сигнала, который вы регистрируете, используя функции POSIX. Обратите внимание, что для этого требуется система POSIX и, следовательно, не такая портативная, как другие решения.
  • Другой (аналогичный) вариант заключается в использовании механизма «завершения»: вызов std::terminate(); когда вы обычно бросаете свое исключение. Поместите свой «catch» -code в функцию «terminate handler» с сигнатурой void(*)() , то есть без параметров и без возвращаемого значения, позвоните функции void handle_terminate() . Установите обработчик завершения с помощью std::set_terminate( , Однако я этого не пробовал, и это звучит ужасно уродливо.
  • Вы можете реализовать поведение, подобное исключению, с помощью инструкций по сборке, но, пожалуйста , не пытайтесь это делать дома, так как поведение такого кода определяется высокой реализацией (если оно не определено) и слишком уродливое для реализации.

leemes 24 июль 2014, в 10:10
Поделиться

Короче говоря, вы не можете (ну. вы могли бы, используя вместо этого прыжки, но тогда у вас было бы две проблемы для решения).

Исключительное решение — это тот, который нужно использовать, но не бросайте число (число — особенно магическое число в этом случае ничего не говорит).

Вместо этого определите struct func_3_interrupted <>; минималистическая структура, имя типа которой говорит вам, что это «прерывание» func_3, и вместо этого поймать; Структура должна быть пустой (или близкой к пустой), и она, вероятно, не должна наследоваться от иерархии std::exception .

Читайте также:
Джиллиан майклс программа для начинающих отзывы

utnapistim 24 июль 2014, в 10:13
Поделиться

Return может использоваться для возврата к вызывающему абоненту и остановки выполняемой функции

int GLOBAL_FLAG = 1; function called_function() < printf(«Inside Function») if(/*some condition*/) < GLOBAL_FLAG = 0; return; >/*Normal function code*/ > int main() < < called_function(); if(GLOBAL_FLAG == 1)/*continue program execution*/ printf(«Function had been executed.Back to normal flow») >

Поэтому, когда встречается оператор return, он возвращается к caller который здесь является main и продолжает выполнение остальных операторов в main функции.

Sunil Hari 24 июль 2014, в 08:44
Поделиться

Примечание: OP говорит, что не может модифицировать func_1 и func_2 , что делает return не работающим, так как оставшийся код в func_1 и func_2 будет по-прежнему вызываться после func_3 .

crashmstr 24 июль 2014, в 12:04
См модифицированный ответ
Sunil Hari 24 июль 2014, в 12:12

Нет, потому что func_1 , и он вызывает func_2 (оба из которых не могут быть изменены), который затем вызывает func_3 (очевидно, единственную модифицируемую функцию). Это func_3 который должен иметь возможность вернуться обратно к main без выполнения какого-либо кода, пока он не достигнет main .

crashmstr 24 июль 2014, в 12:58
Показать ещё 1 комментарий

Ещё вопросы

  • 1 Как читать китайский текстовый файл (Python)
  • 0 Ранговый запрос не работает
  • 0 какой тип содержимого установить, если содержимое страницы содержит смесь php, html, css и javascript / jquery… и расширение файла было php?
  • 0 Использование авто-ключевого слова и полагаться на ввод типа компилятора
  • 0 как повысить эффективность моего запроса
  • 0 AngularJS — запись в динамические переменные области видимости
  • 0 Один пользователь несколько адресов доставки, как сделать это по умолчанию
  • 1 Как создать объект в Form1 из другого класса?
  • 0 MySQL: СОЕДИНЕНИЯ на основе 1 к 1
  • 1 Распределить данные из текущей деятельности по фрагментам на ней
  • 0 URL меняется в magento
  • 1 FusedLocationProviderClient RemoveLocationUpdatesAsync Задача не выполнена
  • 0 Yii визуализировать страницу с HTML идентификатором
  • 0 Требовать точку отбрасывания для перетаскивания 2 элементов, а затем вызвать событие
  • 1 HTTPS-соединения — как управляются пары ключей
  • 1 Как заставить работать внутренние плагины eslint без префикса eslint-plugin- *
  • 0 Отладка без отладочных символов
  • 1 Ярлык всегда отключен из-за ошибки «Приложение не установлено»
  • 0 На что ссылается государство в $ stateprovider?
  • 1 Как я использую python selenium для нажатия на панель навигации с выпадающим
  • 0 Как запретить Tomcat 7 / Spring / Tiles обрезать пробелы в выводе HTML
  • 1 Как я могу получить свой GET-запрос залпа на возврат информации из незащищенного протокола?
  • 0 ng-options объекта, как получить значение ключа для функции (angularJS)
  • 1 Не удается подключиться к одноузловому серверу Kafka через Docker
  • 0 Как получить / Перенаправить на следующую страницу после отправки запроса с помощью cURL в PHP?
  • 1 Вызов Python из VBA — возврат значения функции Python
  • 0 Условно добавить строку в HTML с угловым выражением
  • 1 Проверка значений NaN в кадре данных pandas со столбцами int8
  • 0 Как создать два отдельных git-репозитория в одной папке?
  • 0 добавление слушателей событий в ng-tags-input
  • 0 Как я могу центрировать кнопки внутри DIV, чтобы было одинаковое пространство справа и слева от четырех кнопок?
  • 0 Ошибка подтверждения mfc при попытке создать страницу свойств
  • 1 Попробуйте поймать и, наконец, с заявлениями возврата
  • 1 C # AsyncSockets, куда отправлять данные без получения данных раньше?
  • 0 Как искать каталоги только на главной странице magento
  • 0 c ++ перезаписывает данные файла?
  • 0 Ошибка при использовании активных записей для get_where и левого соединения
  • 0 Почтовый штемпель в PHP 5: проверьте, была ли почта отклонена или была успешной
  • 1 изменение цвета рамки текстового поля, если проверка не удалась
  • 0 Сбой wglMakeCurrent на x64
  • 1 Действия в андроид студии не переключаются после нажатия кнопки
  • 0 заменить каждое выбранное значение случайной буквой / цифрой
  • 0 Могу ли я создать объект в том же классе?
  • 0 Magento, неверные цены в корзине
  • 0 JQuery — слияние / несколько $ (это) My в той же функции
  • 0 ClassNotFoundException Java JApplet
  • 1 ошибка: [Dagger / MissingBinding] при попытке построения проекта
  • 0 ngresource получить ошибку при доступе к свойствам ресурса
  • 0 Как angular узнает, что $ httpBackend заменяет $ http в тестах angularjs?
  • 0 Как я могу получить все выбранные значения флажка при отправке действия с использованием угловых JS?

Источник: overcoder.net

7.10 – Инструкции break и continue

Хотя вы уже видели инструкцию break в контексте операторов switch (7.4 – Основы работы с оператором switch ), она заслуживает более полного рассмотрения, поскольку ее можно использовать и с другими типами инструкций управления порядком выполнения программы. Инструкция break вызывает завершение цикла while , цикла do — while , цикла for или оператора switch , при этом выполнение продолжается со следующей инструкции после цикла или switch , из которых выполнен выход.

Прекращение выполнения switch

В контексте оператора switch инструкция break обычно используется в конце каждой метки case , чтобы показать, что метка case завершена (что предотвращает проваливание к последующим меткам):

#include void printMath(int x, int y, char ch) < switch (ch) < case ‘+’: std::cout 7.5 – Проваливание и область видимости в switch».

Прекращение выполнения цикла

В контексте цикла инструкция break может использоваться для преждевременного завершения цикла. Выполнение продолжается со следующей инструкции после конца цикла.

Например:

#include int main() < int sum< 0 >; // Разрешить пользователю ввести до 10 цифр for (int count< 0 >; count < 10; ++count) < std::cout ; std::cin >> num; // выход из цикла, если пользователь вводит 0 if (num == 0) break; // exit the loop now // иначе добавляем число к нашей сумме sum += num; > // после break выполнение продолжится здесь std::cout

Эта программа позволяет пользователю ввести до 10 чисел и в конце отображает сумму всех введенных чисел. Если пользователь вводит 0, break приводит к преждевременному завершению цикла (до того, как будут введены 10 чисел).

Вот пример выполнения показанной выше программы:

Enter a number to add, or 0 to exit: 5 Enter a number to add, or 0 to exit: 2 Enter a number to add, or 0 to exit: 1 Enter a number to add, or 0 to exit: 0 The sum of all the numbers you entered is: 8

break также является распространенным способом выхода из преднамеренного бесконечного цикла:

Читайте также:
Лучшая программа учет трафика

#include int main() < while (true) // бесконечный цикл < std::cout ; std::cin >> num; // выход из цикла, если пользователь вводит 0 if (num == 0) break; > std::cout

Пример выполнения показанной выше программы:

Enter 0 to exit or anything else to continue: 5 Enter 0 to exit or anything else to continue: 3 Enter 0 to exit or anything else to continue: 0 We’re out!

break против return

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

#include int breakOrReturn() < while (true) // бесконечный цикл < std::cout > ch; if (ch == ‘b’) break; // выполнение продолжится с первой инструкции за пределами цикла if (ch == ‘r’) return 1; // return заставит функцию немедленно вернуться в вызывающую // функцию (в данном случае main()) > // прерывание цикла приводит к возобновлению выполнения здесь std::cout int main() < int returnValue< breakOrReturn() >; std::cout

Вот результаты двух запусков этой программы:

Enter ‘b’ to break or ‘r’ to return: r Function breakOrReturn returned 1
Enter ‘b’ to break or ‘r’ to return: b We broke out of the loop Function breakOrReturn returned 0

Инструкция continue

Инструкция continue предоставляет удобный способ завершить текущую итерацию цикла без завершения всего цикла.

Вот пример использования continue :

#include int main() < for (int count< 0 >; count < 10; ++count) < // если число делится на 4, пропустить эту итерацию if ((count % 4) == 0) continue; // перейти к следующей итерации // если число не делится на 4, продолжаем std::cout return 0; >

Эта программа печатает все числа от 0 до 9, которые не делятся на 4:

1 2 3 5 6 7 9

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

В случае цикла for конечное выражение цикла for по-прежнему выполняется после continue (поскольку это происходит после конца тела цикла).

Будьте осторожны при использовании инструкции continue с циклами while или do — while . Эти циклы обычно изменяют значения переменных, используемых в условии, внутри тела цикла. Если использование инструкции continue приводит к пропуску этих строк, цикл может стать бесконечным!

Рассмотрим следующую программу:

#include int main() < int count< 0 >; while (count < 10) < if (count == 5) continue; // переход к концу тела цикла std::cout return 0; >

Эта программа предназначена для печати всех чисел от 0 до 9, кроме 5. Но на самом деле она печатает:

0 1 2 3 4

а затем переходит в бесконечный цикл. Когда count равно 5, оператор if принимает значение true , а continue приводит к переходу выполнения в конец цикла. Переменная count не увеличивается. Следовательно, на следующей итерации счетчик по-прежнему равен 5, условие оператора if так же равно true , и программа продолжает цикл бесконечно.

Конечно, вы уже знаете, что если у вас есть очевидная переменная счетчика, вам следует использовать цикл for , а не циклы while или do — while .

Споры по поводу использования break и continue

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

Однако при разумном использовании break и continue могут помочь сделать циклы более читаемыми, уменьшив количество вложенных блоков и уменьшив потребность в сложной логике циклов.

Например, рассмотрим следующую программу:

#include int main() < int count< 0 >; // подсчитывает, сколько раз цикл повторяется bool keepLooping < true >; // управляет, завершить цикл, или нет while (keepLooping) < std::cout ; std::cin >> ch; if (ch == ‘e’) < keepLooping = false; >else < ++count; std::cout > return 0; >

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

А вот версия, которую легче понять, и которая использует инструкцию break :

#include int main() < int count< 0 >; // подсчитывает, сколько раз цикл повторяется while (true) // цикл до завершения пользователем < std::cout ; std::cin >> ch; if (ch == ‘e’) break; ++count; std::cout return 0; >

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

Минимизация количества используемых переменных и уменьшение количества вложенных блоков улучшают понятность кода больше, чем break или continue навредят ему. По этой причине мы считаем приемлемым разумное использование break и continue .

Лучшая практика

Используйте break и continue , когда они упрощают логику цикла.

Споры по поводу использования ранних возвратов

В отношении инструкций return можно привести аналогичный аргумент. Инструкция return , которая не является последней инструкцией в функции, называется ранним возвратом. Многие программисты считают, что ранних возвратов следует избегать. Функция, которая имеет только одну инструкцию return в нижней части функции, отличается простотой – вы можете предположить, что функция без отклонений будет принимать свои аргументы, выполнять любую реализованную логику и возвращать результат. Наличие дополнительных инструкций return усложняет логику.

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

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

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

Лучшая практика

Используйте ранние возвраты, если они упрощают логику вашей функции.

Источник: radioprog.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru