Существует ли «Предопределенное исключение» для обработки ошибок индексирования ArrayOutOfBounds в PHP?

#php #error-handling #try-catch #indexoutofboundsexception

Вопрос:

С помощью этой divideByZero() функции он выдает ошибку и запускает метод catch:

 function divideByZero() {
    return 1/0;
};


try {
  divideByZero();
  echo "i dont run";
} catch ( DivisionByZeroError $err) {
  echo $err;  //"DivisionByZeroError: Division by zero in C"
} 

Что именно то, что я хочу, но я могу получить это сообщение только с помощью DivisionByZeroError «Предопределенного исключения»PHP.

Теперь мне интересно, как я могу получить такую же функциональность с помощью этой arrayOutOfBounds() функции:

 function arrayOutOfBounds() {
   $arr = ["", "", ""];
   return $arr[3]; //index doesnt exist.
};

try {
 arrayOutOfBounds();
 echo "I still run, even though the arrayOutOfBounds function has a problem";
} catch (Error $err) { // <-- is the issue here?
  echo $err; //I dont run.
}; 

Со второй arrayOutOfBounds() функцией это не catch ошибка, она завершает остальную часть кода в try блоке, но также автоматически echo «s» Предупреждение: Неопределенный ключ массива 3 в C:Users на линии #».

Я бы просто хотел, чтобы эта arrayOutOfBounds() функция перехватывала ошибку индекса, а не запускала остальную часть кода в try блоке и echo правильное $err сообщение.

Я просмотрел документацию и перепробовал их все.

Комментарии:

1. Вы не можете поймать исключение, когда с самого начала ни одно из них не выбрасывается. Доступ к несуществующему элементу массива просто не выполняется.

2. @CBroe Спасибо за исправление моего недопонимания, есть ли способ проверить, является ли это ошибкой индексирования в arrayOutOfBounds() функции, и выдать ошибку, которая будет поймана в блоке try?

3. В настоящее время я изучаю это исключение: php.net/manual/en/class.outofboundsexception.php

4. Возможно, некоторые другие функции/классы SPL создают такого рода исключения, но простой доступ к массиву этого не делает. Все примеры в комментариях на этой странице сами активно выдают исключения такого типа.

5. @CBroe Да, я думаю, мне придется выбросить его вручную. Я опубликую свое решение, но я все еще открыт для автоматического решения.

Ответ №1:

Я не уверен, что есть лучший способ сделать это, но вот ручное решение. Ошибка не генерируется автоматически, как в divideByZero() функции, поэтому я выдал ошибку вручную.

 function arrayOutOfBounds() {
  $arr = ["", "", ""];
  if (isset($arr[3])) {} else {
    throw new OutOfBoundsException("Index was outside the bounds of the array.");
  }
};

try {
  arrayOutOfBounds();
  echo "test"; //i dont run anymore
} catch (OutOfBoundsException $err) {
  echo $err; //i echo the $err message
}; 

Комментарии:

1. if ($arr[3]) все равно будет создано Undefined array key / Undefined offset предупреждение/уведомление, если вы хотите, чтобы это также не отображалось, вам следует проверить, существует ли элемент с помощью isset .