2017-01-27 7 views
0

の違反:エイダ:私は(GPSでコンパイル)、次のコードを持ってLED_Demo STM32のサンプルプロジェクトで「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

「例外」で宣言されていない「Exception_Information」も表示されます(これはravenscar-sfp-stm32f4と同じです)。 –

答えて

4

これはドキュメントに説明されています。

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

(強調追加)

5.1.28 No_Exception_Propagation

[GNATこの制限は、例外は外側サブプログラムスコープに伝播 決してないことを保証します。 例外が発生する唯一のケースは、ハンドラが同じ サブプログラムに静的に含まれている場合です。したがって、raiseの効果は基本的にgoto ステートメントのようなものです。他のraise文(暗黙的または明示的)は、 が未処理とみなされます。例外ハンドラは許可されています()が、例外発生識別子(例外の選択)を含む が含まれていない可能性があります。 で、パッケージGNAT.Current_Exceptionの使用は許可されていません。 とreraise文(オペランドなしでraise)は許可されていません。

識別子Errorは制限に違反しています。

+0

"例外ハンドラは許可されていますが、例外発生識別子(例外選択)が含まれていない可能性があります。あなたはこれの根拠を知っていますか? – evilspacepirate

+0

@ジョンソン:いいえ、私はしません。おそらく、それは他の場所を渡すような例外的な出来事で悪意のある行為をするのに使われるかもしれませんが、私のエイダはかなり錆びています。あるいは、そのような方法を施行しやすくする技術的な理由があるかもしれません。 –