虽然 PHP 没有经典的“编译时间”(或者没有为此进行大量静态检查的编译器),但我会将“编译时间”视为“我在编写代码时做错的相当静态的东西”和“运行时间”作为“我的逻辑、输入或验证在某些时候关闭”。
所以我的建议是这样对待它:
"Compile Time" / "OutOfRangeException"
:错误总是可以在源代码中修复,无需或几乎没有逻辑。
我总是取 1-10 的数字,你输入 11
"Run Time" / "OutOfBoundsException"
: 错误是由于在运行时错误使用造成的。
你创造了我并告诉我取值从 1 到 5 然后你输入 7。不计算
或者
您请求的索引不存在,因为您没有按应有的方式将其放在那里
样本:
我希望 SplFixedArray 抛出一个,OutOfBoundsException
因为它的大小是动态的,并且可能在运行时有机会,而我希望Calender::getMonthName
抛出类似 a 的东西,OutOfRangeException
因为月数肯定是固定在“编译/写入”时间。
数组对象示例:
假设 $array 是一个实现 ArrayAccess 的对象,您可以OutOfBoundsException
在这些情况下抛出一个:
$array['bar'];
$array[7];
因为这些值是您对 ArrayAccess 的期望值,但在 SplFixedArray(5) 的情况下它没有意义。替代方案将是DomainException
或可能RangeException
在OutOfRangeException
这些情况下:
$calendar->getMonth(15);
当放置一个数组或一个新类时,代码中肯定存在一些更大的逻辑缺陷,这通常是由程序员一个简单的“哦,我输入了错误的变量”错误造成的。一个(也许更可取的)替代方案是UnexpectedValueException
and good old InvalidArgumentException
。
对于以下情况:
$array[array()];
$array[new StdClass];
一些替代例外似乎更合适。
与 Java 世界比较何时使用的异常并不总是适用的,因为 Java 开发人员有一个附加问题需要处理。
已检查/未检查的异常。许多人认为所有不是运行时异常的东西在 Java 中的用途都非常有限/不应该在内部大量使用)这些名称已经失去了一些原来的含义和意图。