好奇:为什么 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
异常,没有明确的违规索引可报告:因此这两个异常携带不同的信息。
考虑使用参数调用函数 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
异常,没有明确的违规索引可报告:因此这两个异常携带不同的信息。