确定Ada断言失败的原因

确定Ada断言失败的原因,ada,assertions,ada2012,Ada,Assertions,Ada2012,如果断言失败,我将获得以下输出: 引发SYSTEM.ASSERTIONS.ASSERT\u失败:文件中的动态\u谓词失败。adb:36 我能得到更多的细节吗?例如,输入是什么,或者可能是堆栈跟踪,或者可能有助于我确定断言失败原因的任何其他内容?您可以捕获System.Assertions.Assert\u无法使用GNAT打印堆栈跟踪。回溯(如果使用GNAT)包或打印值 像这里一样 pragma断言\u策略(检查); 使用Ada.Text_IO;使用Ada.Text\u IO; 用蚊虫追踪; 系统

如果断言失败,我将获得以下输出:

引发SYSTEM.ASSERTIONS.ASSERT\u失败:文件中的动态\u谓词失败。adb:36


我能得到更多的细节吗?例如,输入是什么,或者可能是堆栈跟踪,或者可能有助于我确定断言失败原因的任何其他内容?

您可以捕获System.Assertions.Assert\u无法使用GNAT打印堆栈跟踪。回溯(如果使用GNAT)包或打印值

像这里一样

pragma断言\u策略(检查);
使用Ada.Text_IO;使用Ada.Text\u IO;
用蚊虫追踪;
系统断言;
带有GNAT.Traceback.Symbolic;
主要程序是
过程调用\u堆栈为空
Trace:GNAT.Traceback.Tracebacks_数组(1..1_000);
长度:自然长度;
开始
GNAT.Traceback.Call_链(Trace,Length);
Put_行(GNAT.Traceback.Symbolic.Symbolic_回溯(Trace(1..Length));
结束调用栈;
类型Day是新字符串(1..10);
类型消息是记录
发送:天;
收到:天;
以结束记录
动态_谓词=>Message.Sent“1776-07-04”,Sent=>“1783-09-03”);
例外
当System.Assertions.Assert\u失败=>
调用堆栈;
Put_行(字符串(M.Sent));
Put_行(字符串(M.Received));
端干管;
或者您可以调试您的程序,正如我在评论中提到的

您可能会发现System.Assertions.Assert\u无法使用GNAT打印堆栈跟踪。回溯(如果使用GNAT)包或打印值

像这里一样

pragma断言\u策略(检查);
使用Ada.Text_IO;使用Ada.Text\u IO;
用蚊虫追踪;
系统断言;
带有GNAT.Traceback.Symbolic;
主要程序是
过程调用\u堆栈为空
Trace:GNAT.Traceback.Tracebacks_数组(1..1_000);
长度:自然长度;
开始
GNAT.Traceback.Call_链(Trace,Length);
Put_行(GNAT.Traceback.Symbolic.Symbolic_回溯(Trace(1..Length));
结束调用栈;
类型Day是新字符串(1..10);
类型消息是记录
发送:天;
收到:天;
以结束记录
动态_谓词=>Message.Sent“1776-07-04”,Sent=>“1783-09-03”);
例外
当System.Assertions.Assert\u失败=>
调用堆栈;
Put_行(字符串(M.Sent));
Put_行(字符串(M.Received));
端干管;
或者您可以调试您的程序,正如我在评论中提到的

在这种情况下,我会尝试使用调试器。请看,在这种情况下,我会尝试使用调试器。请看!我想知道我是否能抓住这种例外——只是我这样做:很好!我想知道我是否能捕捉到这种异常——只是我是这样做的: