无法处理ada任务中的异常

时间:2017-05-11 13:15:14

标签: loops select task call ada

我有以下示例:

with Ada.TEXT_IO;
use Ada.TEXT_IO;

procedure main is

  task Test is
    entry Call1;
    entry Call2;
  end Test;

  task body Test is
    Num : Integer := 5;
  begin
    loop
      select when Num < 5 =>
        accept Call1 do
          Put_Line("Call1 called!");
        end Call1;
      or when Num > 5 =>
        accept Call2 do
          Put_Line("Call2 called!");
        end Call2;
      or
        terminate;
      end select;
    end loop;
    exception when PROGRAM_ERROR => Put_Line("Nothing to call... :(");
  end Test;

begin
  Test.Call1;
end;

如果我是对的,当任务无法调用任何内容时,任务会获得program_error。当我运行它时,它会陷入无休止的循环中。我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

我认为你正试图探讨在ARM 9.7.1(21)中没有开放select替代方案时会发生什么,

  

如果所有替代方案都已关闭且没有其他部分,则会引发异常Program_Error。

问题是, terminate是一个选择(4),同上)并且无法关闭,因此并非所有替代方案都已关闭且{{1}坐在Test,准备在主程序退出时死亡。但主要计划是terminate。死锁。

如果您取消Test.Call1,则会获得您期望的or terminate;任务终止,主程序获得Program_Error

在一个理想的世界中,编译器会发现Tasking_Error都不能打开的事实;据推测,没有人能够深入地实施检查(通常问题就不那么明显了)。