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

由于PHP不是一种编译语言,因此编译时和运行时之间的区别似乎很奇怪,因此我发现很难理解何时使用哪个异常。
目前我的理解是应该扔...
... OutOfRangeException(如果 key 在本质上和本质上是错误的),例如如果将数组作为键传递。
... OutOfBoundsException,如果 key 通常还可以,但不在某些范围内,例如如果传递了10050是最大 key 。
这种理解正确吗?

最佳答案

虽然PHP没有经典的“编译时间”(或对此问题进行大量静态检查的编译器),但我还是将“编译时间”视为“在编写代码时做错了的静态​​事情”和“运行时间”表示为“我的逻辑,输入或验证有时已关闭”。
所以我的建议是这样对待:"Compile Time" / "OutOfRangeException":总是可以在没有或很少逻辑的情况下在源代码中修复错误。

"Run Time" / "OutOfBoundsException":该错误是由于在运行时使用错误而引起的。

或者


样本:
我希望SplFixedArray可以抛出OutOfBoundsException,因为它的大小是动态的,并且在运行时可能会出现机会,而我希望诸如Calender::getMonthNameOutOfRangeException这样的东西会出现,因为月份数绝对固定为“编译/写入”时间。
数组对象样本:
说$ array是一个实现ArrayAccess的对象,在以下情况下,您可以抛出OutOfBoundsException:

$array['bar'];
$array[7];
因为这些值是您对ArrayAccess可能期望的值,但是对于SplFixedArray(5)而言,这是没有意义的。替代方法是DomainExceptionRangeException在以下情况下,为OutOfRangeException:
$calendar->getMonth(15);
在放置数组或新类时,代码中肯定存在更大的逻辑缺陷,通常是程序员简单的“哦,我输入了错误的变量”错误导致的。一个(也许更可取的)替代方法是UnexpectedValueException和好的旧InvalidArgumentException
对于像这样的情况:
$array[array()];
$array[new StdClass];
一些替代性异常(exception)似乎更合适。
与Java世界的比较(在何时使用异常(exception))并不总是适用的,因为Java开发人员还需要处理其他问题。
已检查/未检查的异常。许多人争辩说,不是运行时异常的所有东西在Java中的使用都非常有限/不应在内部使用太多),这些名称已经失去了一些原始含义和意图。

关于php - OutOfRangeException与OutOfBoundsException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8193798/

10-09 12:43