2024 PHP Conference Japan

OutOfRangeException 類別

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

簡介

當請求了非法的索引時拋出的例外。這表示應該在編譯時檢測到的錯誤。

類別概要

class OutOfRangeException extends LogicException {
/* 繼承的屬性 */
protected 字串 $message = "";
私有 字串 $string = "";
保護 整數 $code;
保護 字串 $file = "";
保護 整數 $line;
私有 陣列 $trace = [];
私有 ?Throwable $previous = null;
/* 繼承的方法 */
公開 Exception::__construct(字串 $message = "", 整數 $code = 0, ?Throwable $previous = null)
最終 公開 Exception::getMessage(): 字串
最終 公開 Exception::getCode(): 整數
最終 公開 Exception::getFile(): 字串
最終 公開 Exception::getLine(): 整數
最終 公開 Exception::getTrace(): 陣列
}
新增註解

使用者貢獻的註解 4 則註解

4
Jakub
7 年前
我這樣看待這個問題
根據定義,OutOfRangeException 應該用於潛在問題是邏輯上的錯誤 - 由於錯誤的程式碼或定義而發生。OutOfBoundsException 則是用於執行時期的錯誤。

範例(另請參閱「OutOfBoundsException 類別」文章中的註解)
<?php
function prepareData(PDOStatement $s) {
$x = $s->fetch();
if (!isset(
$x['secretColumn']))
throw new
OutOfRangeException ("Secret column 不存在!請驗證表格定義和查詢。");
}
3
Free
4 年前
我嘗試編寫一個可以在編譯時被檢測到的程式碼片段,但由於我的 PHP 引擎的直譯特性而無法實現。創建者應該提供一個使用範例(給終端使用者)或指向 PHP 原始碼以說明其使用位置/方式的範例。到目前為止,所提供的範例都沒有反映在編譯時檢測到的例外,如這個類別所聲稱的。

在我看來,期望編譯器在動態類型、通常是 JIT 執行的環境中檢測到非法索引,充其量只是一種奢望。從什麼時候開始,對於哪些索引應該被視為「範圍內」有了嚴格的約定,以及編譯器如何知道這個約定?此外,我們如何在編譯階段進行 try/catch?

SPL 也提供了 OutOfBounds 例外。如果這個類別、其父類別和 OOB 幾乎沒有區別,那麼 SPL 需要所有這三個嗎?
1
evguenia dot chagnon at gmail dot com
7 年前
範例

$calendar = new Calendar();
$calendar->getMonth(15);
0
anrdaemon at yandex dot ru
2 年前
我可能會重複 @jacub 的答案,但我認為區別如下

當_您_ _設定_邊界並且不希望外部實體越界,但它們可能會越界時,您會拋出 `OutOfBoundsException`。
範例:您要求輸入 1 到 6 範圍內的數字,而使用者輸入 0 或 7 或其他數字。您拋出一個例外,指示使用者錯誤,他們可以修正。

當您期望值在允許的邊界內,但實際操作失敗時,您會拋出 `OutOfRange`。
範例:您嘗試使用 API 本身提供的資訊來存取外部 API 呼叫,但它突然告訴您參考鍵未指向有效物件。您拋出一個例外,指示使用者無法更正的內部錯誤。

在這兩種情況下,關鍵詞都是「您拋出」。這兩個例外都是在執行時期產生的,但後者描述了一種在系統配置正確的情況下永遠不應該發生的情況。
To Top