好奇:为什么 IndexOutOfBounds 异常与 Rascal 中的 emptyList 异常不同?

curious: Why is IndexOutOfBounds exception different from emptyList exception in Rascal?

考虑使用参数调用函数 foobar,

list[int] exampleA=[1,2,3];
list[int] exampleB=[];

//call with under-sized list
foobar(exampleA); //everything ok, exception caught and handled

//call with empty list
foobar(exampleB); //throws an exception: emptyList

public void foobar(list[int] intList)
{
  try
  {
    int i=0;
    while(i<=5)
    {
        println(intList[i]);
        i++;
    }
  }
  catch IndexOutOfBounds(msg):
  {
    //do something
  }
}

IndexOutOfBounds 在技术上不应该与 emptyList 相同吗?这些情况被认为是两种不同的异常情况的原因可能是什么?

好问题。

异常 EmptyList 解决了函数或运算符需要非空列表作为参数的情况。例如,在 head([]) 中获取一个空列表的头部会给出此异常。

异常IndexOutOfBounds总是与列表(list)、列表关系(lrel)、字符串(str)上的非法索引操作相关联或元组 (tuple) 并涉及非法索引。此异常携带有问题的索引作为额外信息。

我们之所以做出区分,是因为对于 EmptyList 异常,没有明确的违规索引可报告:因此这两个异常携带不同的信息。