Ада: Нарушение "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
нарушает ограничение.