Ада: Нарушение "No_Exception_Propagation"

В примере проекта LED_Demo STM32 у меня есть следующий код (который компилируется в GPS):

procedure Does_Nothing is
begin
   Null;
exception
   when others =>
      Null;
end Does_Nothing;

Если я изменю тот же код для кода ниже, он не скомпилируется. Я получаю ошибку "нарушение ограничения No_Exception_Propagation".

procedure Does_Nothing is
begin
   Null;
exception
   when Error: others =>
      UART.Put(Exception_Information(Error));
end Does_Nothing;

Может кто-нибудь объяснить, почему это так?

1 ответ

Решение

Это объясняется в документации.

https://gcc.gnu.org/onlinedocs/gnat_rm/No_005fException_005fPropagation.html

(выделение добавлено)

5.1.28 No_Exception_Propagation

[GNAT] Это ограничение гарантирует, что исключения никогда не распространяются на внешнюю область подпрограммы. Единственный случай, когда исключение может быть вызвано, - это когда статически обработчик находится в той же подпрограмме, так что эффект повышения по существу похож на оператор goto. Любое другое выражение повышения (неявное или явное) будет считаться необработанным. Обработчики исключений разрешены, но не могут содержать идентификатор возникновения исключения (выбор исключения). Кроме того, использование пакета GNAT.Current_Exception не допускается, а операторы ререйза (рейз без операнда) не допускаются.

Идентификатор Error нарушает ограничение.

Другие вопросы по тегам