Почему операторы try catch не работают в TwinCAT 4024.7 - PullRequest
0 голосов
/ 04 марта 2020

Я пробую недавно реализованные операторы try / catch, которые доступны с TwinCAT 4024.0. Однако при компиляции появляется следующая ошибка:

Генератор кода для текущего устройства не поддерживает структурированную обработку исключений.

Пример кода ( исходный код ):

FUNCTION F_Calc : LREAL
VAR_INPUT
  pData     : POINTER TO ARRAY [0..9] OF LREAL;
  nElementA : INT;
  nElementB : INT;
END_VAR
VAR
  exc       : __SYSTEM.ExceptionCode;
END_VAR

__TRY
  F_Calc := pData^[nElementA] / pData^[nElementB];
__CATCH (exc)
  IF (exc = __SYSTEM.ExceptionCode.RTSEXCPT_ARRAYBOUNDS) THEN
    F_Calc := -1;
  ELSIF ((exc = __SYSTEM.ExceptionCode.RTSEXCPT_FPU_DIVIDEBYZERO) OR
         (exc = __SYSTEM.ExceptionCode.RTSEXCPT_DIVIDEBYZERO)) THEN
    F_Calc := -2;
  ELSIF (exc = __SYSTEM.ExceptionCode.RTSEXCPT_ACCESS_VIOLATION) THEN
    F_Calc := -3;
  ELSE
    F_Calc := -4;
  END_IF
__ENDTRY

1 Ответ

1 голос
/ 04 марта 2020

Оказывается, операторы try catch пока не поддерживаются для 64-битных систем. Это также упоминается в этой статье.

Из раздела комментариев этой статьи о том, почему он еще не работает на 64-разрядных системах:

В случае исключения, внутри происходит довольно много. Например, стек должен быть очищен. Особенно с глубоко вложенными вызовами методов, это может означать много работы. Я подозреваю, что управление памятью структурировано под 32 битами иначе, чем под 64 битами. Однако я предполагаю, что это будет реализовано для 64-битных систем в более поздней сборке.

...