PHP为无效键定义了两个SPL异常:
由于PHP不是一种编译语言,因此编译时和运行时之间的区别似乎很奇怪,因此我发现很难理解何时使用哪个异常。
目前我的理解是应该扔...
... OutOfRangeException
(如果 key 在本质上和本质上是错误的),例如如果将数组作为键传递。
... OutOfBoundsException
,如果 key 通常还可以,但不在某些范围内,例如如果传递了100
但50
是最大 key 。
这种理解正确吗?
最佳答案
虽然PHP没有经典的“编译时间”(或对此问题进行大量静态检查的编译器),但我还是将“编译时间”视为“在编写代码时做错了的静态事情”和“运行时间”表示为“我的逻辑,输入或验证有时已关闭”。
所以我的建议是这样对待:"Compile Time" / "OutOfRangeException"
:总是可以在没有或很少逻辑的情况下在源代码中修复错误。
"Run Time" / "OutOfBoundsException"
:该错误是由于在运行时使用错误而引起的。
或者
样本:
我希望SplFixedArray可以抛出OutOfBoundsException
,因为它的大小是动态的,并且在运行时可能会出现机会,而我希望诸如Calender::getMonthName
和OutOfRangeException
这样的东西会出现,因为月份数绝对固定为“编译/写入”时间。
数组对象样本:
说$ array是一个实现ArrayAccess的对象,在以下情况下,您可以抛出OutOfBoundsException
:
$array['bar'];
$array[7];
因为这些值是您对ArrayAccess可能期望的值,但是对于SplFixedArray(5)而言,这是没有意义的。替代方法是DomainException
或RangeException
在以下情况下,为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/