2017-01-27 2 views
0

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

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; 

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

+0

Я также вижу «Исключение_Информация», не объявленное в «Исключениях» (это с помощью ravenscar-sfp-stm32f4). –

ответ

4

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

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

(подчеркивание добавлено)

5.1.28 No_Exception_Propagation

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

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

+0

«Обработчики исключений допускаются, но могут не содержать идентификатор возникновения исключения (выбор исключения)». Вы знаете причину этого? – evilspacepirate

+0

@ Джонсон: Нет, не знаю. Возможно, это можно было бы использовать, чтобы сделать что-то нелепое с возникновением исключения, например, передавать его в другом месте, но моя Ада довольно ржавая. Или, может быть, есть какая-то техническая причина, которая облегчает ее реализацию. –