#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
.