PHP Conference Japan 2024

OutOfRangeException 类

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

简介

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

类概要

class OutOfRangeException extends LogicException {
/* 继承的属性 */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* 继承的方法 */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
}
添加注释

用户贡献的注释 4 条注释

Jakub
7 年前
我这样理解
根据定义,OutOfRangeException 应该用于潜在问题是逻辑性的情况 - 由于代码或定义错误而发生。OutOfBoundsException 用于运行时。

示例(另请参见“OutOfBoundsException 类”文章中的注释)
<?php
function prepareData(PDOStatement $s) {
$x = $s->fetch();
if (!isset(
$x['secretColumn']))
throw new
OutOfRangeException ("Secret column doesn't exist! Verify table definition and query.");
}
Free
4 年前
我尝试编写一个将在编译时检测到的代码片段,但未能成功,显然是由于我的 PHP 引擎的解释性质。创建者应该提供一个用法示例(供最终用户使用)或指向 PHP 源代码以获取一个使用示例。迄今为止,提供的示例均未反映此类断言的编译时检测到的异常。

IMO,期望编译器在动态类型的、通常是 JIT 执行的环境中检测到非法索引,充其量是希望。从什么时候开始,对哪些索引应被视为“在范围内”有一个严格的契约,以及编译器如何知道这个契约?此外,我们如何在编译阶段尝试/捕获它?

SPL 还提供了 OutOfBounds 异常。如果此类、其父类和 OOB 区别不大,那么 SPL 是否需要这三个?
evguenia dot chagnon at gmail dot com
7 年前
示例

$calendar = new Calendar();
$calendar->getMonth(15);
anrdaemon at yandex dot ru
2 年前
我可能会重复 @jacub 的回答,但我认为区别在于

`OutOfBoundsException` 当_您_ _设置_ 范围并且不希望外部实体越过它们时,您会抛出它,但它们可能是。
示例:您请求一个在 [1, 6] 范围内的数字,而用户输入 0 或 7 或其他内容。您抛出一个异常,指示用户可以修改的错误。

`OutOfRange` 当您期望值在允许的边界内,但实际操作失败时,您会抛出它。


示例:您正在尝试使用 API 本身提供的信息访问外部 API 调用,并且它突然告诉您引用键没有指向有效的对象。您抛出一个指示内部故障的异常,用户无法纠正。

在这两种情况下,关键词都是“您抛出”。这两种异常都是在运行时生成的,但后者描述了一种不应该发生的情况,如果系统配置正确,则永远不会发生。
To Top