OutOfRangeException与OutOfBoundsException

Nik*_*kiC 33 php spl exception

PHP 为无效密钥定义了两个SPL异常:

OutOfRangeException:请求非法索引时抛出异常.这表示应该在编译时检测到的错误.

OutOfBoundsException:如果值不是有效键,则抛出异常.这表示在编译时无法检测到的错误.

由于PHP不是编译语言,编译时和运行时之间的区别似乎很奇怪,因此我发现很难理解使用哪个例外.

目前我的理解是,一个人应该抛出...
... OutOfRangeException如果关键是从根本上和本质上畸形,例如,如果一个数组作为重点过去了.
... OutOfBoundsException如果密钥通常没问题,但不在某些边界,例如,如果100通过但是50是最大密钥.

这种理解是否正确?

edo*_*ian 27

虽然PHP没有经典的"编译时间"(或者编译器对此事进行了大量的静态检查),但我将"编译时间"视为"编写代码时我做错了的相当静态的东西"和"运行时间"as"我的逻辑,输入或验证在某些时候关闭".

所以我的建议就是像这样对待它:

"Compile Time" / "OutOfRangeException":错误始终可以在源代码中修复,不需要或只需很少的逻辑.

我总是拿1-10的数字你输入11


"Run Time" / "OutOfBoundsException":错误是由于在运行时错误使用.

你创建了我并告诉我从1到5取值,然后你输入7.不计算

要么

你请求一个不在那里的索引,因为你没有像你应该那样把它放在那里


样品:

我希望SplFixedArray能够抛出一个,OutOfBoundsException因为它的大小是动态的,并且可以在运行时发生,而我期望类似于Calender::getMonthName抛出的东西,OutOfRangeException因为月份的数量肯定是在"编译/写入"时间固定的.

数组对象示例:

假设$ array是一个实现ArrayAccess的对象,你可以OutOfBoundsException在这些情况下抛出:

$array['bar'];
$array[7];
Run Code Online (Sandbox Code Playgroud)

因为这些值是您对ArrayAccess所期望的值,但在SplFixedArray(5)的情况下它没有意义.替代品将是DomainException或可能RangeException

一个OutOfRangeException在这些情况下:

$calendar->getMonth(15);
Run Code Online (Sandbox Code Playgroud)

作为一个数组或一个新类,代码中肯定存在一些更大的逻辑缺陷,这通常是由程序员的一个简单的"哦,我输入错误的变量"错误引起的.一个(可能更可取的)替代方案将是UnexpectedValueException和旧的InvalidArgumentException.

对于以下情况:

$array[array()];
$array[new StdClass];
Run Code Online (Sandbox Code Playgroud)

一些替代例外似乎更合适.

与Java世界进行比较时,使用的异常并不总是适用于Java开发人员需要处理的附加问题.

已检查/未检查的例外情况.由于许多人认为所有不是运行时异常的东西在Java中使用非常有限/不应该在内部使用太多)这些名称已经失去了一些原始的含义和意图.


Gor*_*don 11

我自己的看法是:

LogicException

用于开发人员所犯的任何错误,例如编程/组装应用程序时的错误.当开发人员运行他/她的UnitTests(这将相当于编译时间)时,有希望抓住这些.这些例外不应该在生产站点上发生,因为它们是软件中的错误.

RuntimeException:

用于用户所做的任何错误或由运行时放入应用程序的无效数据导致的错误.这些错误可能是可预测的,但单元测试无法完全阻止,例如那些可能发生在生产现场.这些异常可能源于错误的使用或编程错误.

OutOfBounds

国际海事组织是什么有效的维基百科定义为数组的范围范围计算机编程,即:

当数组以数字方式编制索引时,其范围是数组的上限和下限.根据环境,如果程序尝试访问超出范围的数组元素,则会发生警告,致命错误或不可预测的行为.

换句话说,当你有一个索引为[0,1,2]的数组时,除了[0,1,2]之外的任何东西都是超出范围的.请注意,Bounds也可以应用于其他数据类型,例如,尝试访问5个字符的字符串中的第7个字符也是OutOfBounds.

OutOfRange:

这个是一个坚韧的饼干.在C++中,OutOfRange是一个扩展LogicException的通用异常(就像在PHP中一样).我不确定给出的示例是否可以轻松转换为PHP代码,或者我上面的编译时间的定义.主要是因为没有人会先启动new Vector(10)并立即尝试访问它at(20).

在Java中OutOfRange似乎是指数学意义上的Range

函数的范围是当我们将所有可能的x值替换为函数时产生的函数的可能y值.

一个参考,我能找到有它虽然延长RuntimeException的,所以我想寻找到其他语言不会帮助解决这个谜团.还有一个关于SPL例外的公开错误报告,说明这一点

  • OutOfRangeException(值超出范围)是LogicException,应该是:RuntimeException

但如果这是正确的,那么OutOfRange与DomainException有何不同?如果你自己的定义是正确的,那么OutOfRange与众不同InvalidArgumentException

长话短说:我不知道OutOfRangeException应该是什么.