PHP Conference Japan 2024

OutOfBoundsException 類別

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

簡介

如果值不是有效的鍵,則會擲出此例外。這表示錯誤無法在編譯時偵測到。

類別概要

class OutOfBoundsException extends RuntimeException {
/* 繼承的屬性 */
protected string $message = "";
private string $string = "";
protected int $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(): 陣列
}
新增註解

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

sricharan dot krishnan at gmail dot com
8 年前
OutOfBoundsException 可能發生的範例
假設在某個除法運算後,我們想要存取陣列中的一個值(當然,前提是除法的結果值在陣列大小範圍內)。

try{
if ($iNum2 == 0){
throw new Exception("除數不能為零");
}
$iResult = $iNum1 / $iNum2;
echo ("除法結果為: ".($iResult)."<br/>");
}
catch (Exception $e){
echo ("除數不能為零".($e)."<br/>");
}

$rg_Array = array(1,2,3,4);

try{
if ($iResult > sizeof($rg_Array)- 1){
throw new Exception("索引值超出範圍");
}
echo ("除法運算後從 \$rg_Array 取得的值:".($rg_Array[$iResult])."<br/>");
}
catch (Exception $e){
echo ("除法結果值超出陣列範圍".($e)."<br/>");
}
?>
Jakub Adamczyk
7 年前
我認為是這樣的
根據定義,OutOfRangeException 應該用於潛在問題是邏輯上的。OutOfBoundsException 則是用於執行時期,所以它很適合捕捉因為資料庫錯誤結果等類似情況發生的錯誤。

使用 OutOfBoundSException 的範例(另請參閱「OutOfRangeException 類別」文章中的註記)

<?php
class HandleApplication {
public function
__construct($_POST) {
if(!isset(
$_POST['secretCode'])
throw new
OutOfBoundsException('應用程式未傳送驗證用的密碼');
}
Jacob V. Rasmussen
9 年前
OutOfRangeException 適用於超出範圍的整數。
OutOfBoundsException 適用於目標陣列中找不到的鍵值。

編者註:這是錯誤的;OutOfRangeException 與整數範圍*無關*。為了教學起見,我決定保留這則獲得高度評價的評論,即使它是錯誤的。
匿名
2 年前
我可能會重複 jacub 的答案,但我認為區別如下

當*你*設定界限,並且不希望外部實體越界,但它們可能會越界時,你應該丟出 `OutOfBoundsException`。
範例:你要求一個範圍在 [1, 6] 的數字,而使用者輸入 0 或 7 或其他數字。你丟出一個例外,指出使用者可以修正的錯誤。

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

在這兩種情況下,關鍵詞都是「你丟出」。這兩個例外都是在執行時期產生的,但後者描述了一種在系統設定正確的情況下不應該發生的情況。
evguenia dot chagnon at gmail dot com
7 年前
class MyDynamicTastyPie implements ArrayAccess{
private $_pointeur = 0;
private $_array = ['草莓片','白巧克力','堅果'];

public function offsetExists($key){
return isset($this->_array[$key]);
}

public function offsetGet($key){
if ($key > count($this->_array)){
throw new OutOfBoundsException('你的美味派沒有這麼多片');
}
return $this->_array[$key]; // 返回 $this->_array 中索引為 $key 的元素
}

public function offsetSet($key, $value){ // 設定 $this->_array 中索引為 $key 的元素值為 $value
$this->_array[$key] = $value; // 將 $value 賦值給 $this->_array 中索引為 $key 的元素
}

public function offsetUnset($key){ // 移除 $this->_array 中索引為 $key 的元素
unset($this->_array[$key]); // 移除 $this->_array 中索引為 $key 的元素
}

public function addSlice($slice){ // 新增一個切片到 $this->_array 的末尾
$this->_array[] = $slice; // 將 $slice 新增到 $this->_array 的末尾
}
}

try { // 嘗試執行以下程式碼
$myDynamicTastyPie = new MyDynamicTastyPie(); // 建立一個 MyDynamicTastyPie 物件
$myDynamicTastyPie->addSlice('Black chocolate cream decoration'); // 新增一個切片 'Black chocolate cream decoration'
echo $myDynamicTastyPie[7]; // 顯示 $myDynamicTastyPie 中索引為 7 的元素
}
catch(OutOfBoundsException $e){ // 捕捉 OutOfBoundsException 例外
echo 'Here is your OutOfBoundsException!'; // 顯示 'Here is your OutOfBoundsException!'
}
To Top