Параметр компилятора require-return-values
Параметр компилятора require-return-values помогает разработчикам выявлять и исправлять проблемы, что приводит к созданию более надёжного кода. Параметр помогает гарантировать, что все пути логического кода имеют операторы RETURN value в определяемых пользователем функциях ABL, не-VOID-методах и получателях свойств. Операторы с отсутствующими RETURN value могут привести к неправильному поведению и коду, который трудно отлаживать. Включение этого параметра во время разработки кода может выявить потенциальные проблемы и предотвратить проблемы в будущем. Этот параметр также может быть полезен при устранении неполадок для выявления кода, который ведёт себя не так, как ожидалось.
Чтобы включить эту функцию, используйте параметр компилятора require-return-values. Сведения о включении параметров компилятора см . в разделе «Параметры компиляции».
Во время компиляции, если опция включена и обнаружено нарушение, выводится сообщение:
All code paths in user-defined function, method, or property getter "name" must return a value due to the "require-return-values" compiler option. (19822)
Сообщение идентифицирует имя определяемой пользователем функции, метода или свойства с нарушением. Оно не определяет, в каком пути или строке отсутствует оператор RETURN value Вам необходимо изучить свой код, чтобы определить, где внести соответствующие исправления.
Если в пользовательской функции, методе, отличном от VOID, или блоке свойств нет операторов потока управления, то в основном блоке пользовательской функции, метода, отличного от VOID, или метода получения свойства требуется оператор RETURN value В следующем примере показана определяемая пользователем функция, несоответствующая условиям параметра компилятора require-return-values:
/* basic.p */ /* Not compliant with require-return-values */ FUNCTION retint RETURNS INTEGER (): MESSAGE "function retint". END FUNCTION. MESSAGE "function return" STRING(retint()).
Добавьте оператор RETURN value , чтобы исключить сообщение warning/error, как показано в следующем примере:
/* basic.p */ /* Compliant with require-return-values */ FUNCTION retint RETURNS INTEGER (): MESSAGE "function retint". RETURN 1. END FUNCTION. MESSAGE "function return" STRING(retint()).
Пока определяемая пользователем функция, метод, отличный от VOID, или метод получения свойства заканчиваются оператором RETURN value, код будет соответствовать требованиям. Если он не заканчивается оператором RETURN value, то вы должны убедиться, что все остальные пути кода соответствуют требованиям.
Обеспечение того, чтобы все другие пути кода предоставляли оператор RETURN value, включает анализ потока управления программами ABL.
Обеспечение соответствия путей кода
Как указывалось ранее, необходимо заканчивать каждую пользовательскую функцию, метод, отличный от VOID, или метод получения свойства оператором RETURN value для того, чтобы сделать код совместимым. Однако, если это нежелательно, вы можете добавить операторы RETURN value к другим конструкциям. Далее описываются различные операторы, которые изменяют поток ABL, и то, как на них влияет параметр компилятора require-return-values. Показаны примеры кода до и после, а также информация о том, как сделать код совместимым. Предполагается, что содержащие пользовательскую функцию, метод или метод получения свойства не заканчиваются оператором RETURN value, поэтому вместо этого должны быть согласованы другие операторы и блоки.
Оператор IF…THEN…FALSE
В операторе IF…THEN…ELSE обе части IF и ELSE требуют оператора RETURN value. Наличие одного оператора внутри условия IF или ELSE не удовлетворяет требованиям оператора require-return-values. Если у вас есть только условие IF, то вы должны добавить условие ELSE и включить оператор RETURN value для обоих.
/* Not compliant with require-return-values */ VAR LOGICAL boolVar = FALSE. IF boolVar THEN RETURN 1.
/* Compliant with require-return-values */ VAR LOGICAL boolVar = FALSE. IF boolVar THEN RETURN 1. ELSE RETURN 0.
Оператор CASE
В операторе CASE должен быть пункт OTHERWISE, который содержит оператор RETURN value, и все WHEN…THEN условия также должны содержать оператор RETURN value .
/* Not compliant with require-return-values */ VAR INT casetest = 3. CASE casetest: WHEN 1 THEN RETURN 2. WHEN 2 THEN RETURN 4. END CASE.
/* Compliant with require-return-values */ VAR INT casetest = 3. CASE casetest: WHEN 1 THEN RETURN 2. WHEN 2 THEN RETURN 4. OTHERWISE RETURN 0. END CASE.
Вложенные операторы потока управления
Операторы потока управления могут появляться друг в друге. Пока каждый внутренний оператор или блок совместим, внешний оператор или блок также совместим. Чтобы удовлетворить параметру компилятора require-return-values, после блока не должно быть операторов.
Блоки CATCH и FINALLY
Принудительное выполнение оператора обязательного RETURN value не выполняется ни в блоке CATCH, ни в FINALLY блоке . Лучшей практикой является не использовать RETURN value в блоке CATCH или FINALLY