Article

PHP Exception


# пример 1 Просто пуляем новую обработку через throw new ExceptionClassName
# и смотрю данные, которые можно вытянуть из-под самой стандартной материнской версии Exception 
try{
   if(2!=3)
   {
      #throw new Exception("this is my message");  code==0,message == this......
         throw new Exception("this is my message",404); // code 404, message "this ...."
   }
}
catch (Exception $e)
{
   # $this->echoHr(); добавил, чтобы не добавлять вечно не добавлять echo ....
   var_dump($e->getMessage(),$e->getCode());$this->echoHr();
   var_dump("GET FILE ==> ",$e->getFile());$this->echoHr();
   var_dump("GET LINE ==> ",$e->getLine());$this->echoHr();
   var_dump("GET TRACE ==> ",$e->getTrace());$this->echoHr();
   var_dump("GET TR AS STR ==> ",$e->getTraceAsString());$this->echoHr();
   var_dump("GET PREV ==> ",$e->getPrevious());$this->echoHr();

}



Как видим, информация почти та же самая, что и без выдачи Exception, вот только тут я сам задал код ответа, сам написал то, что должно показатся пользователю, и если этот обьект направить разрабу, то у них тоже появится инфа, что и к чему.
Круто, да, а теперь, давайте посмотрим, что же есть за исключения то есть в PHP кроме Exception:


Для начала, Exception наследует 2 большие группы:

  1. class LogicException extends Exception == > код выдаёт некорректные(по нашему мнению) данные
  2. class RuntimeException extends Exception ==> код не может самостоятельно вывезти пул действий за заданное к-во время жизни скрипта

LogicException имеет ряд более точечных наследников:

  1. DomainException : нужен в ситуации, когда у вас есть изначально ограниченные в чём то данные(прим: длина пароля 4-25 символов ), и на вход приходят данные правильные, НО не соответствуют ограничению:
    1. throw new DomainException("Длина строки не может быть меньше 4 символов!!!");
  2. InvalidArgumentException - когда мы ожидаем, что придет значение строко такого-то типа или способа (прим: только integer, или только POST)
  3. LengthException - когда длина чего-то слишком длинная/короткая
  4. OutOfRangeException - когда мы запрашиваем несуществующий индекс
    # пример с практики: мне нужно было получить integer, который вычислялся с массива, ORDER BY quest_importance DESC 
    $topImportance=(reset($data))->quest_importance+1;
    # здесь всё супер, но, что будет, если придет пустой массив?
    	
  5. BadFunctionCallException - когда мы либо вызываем несуществующую ф-ю, либо к-во аргументов не соответствует
  6. BadMethodCallException extends BadFunctionCallException - то же самое, только когда мы работаем с методом

Наследники RuntimeException

  1. OutOfBoundsException - когда у нас контент генерится динамически, и мы пытаемся достучатся к индексу, которого сейчас нет. Используется тогда, когда ошибка не может быть обнаружена до прогона кода(прим: на тестовой базе всё ок, а вот на проде такой записи нету).Почему тут, а не в LogicException? Потому что Logic работает с данными, которые заранее известно как должны быть , и заранее пришли (не с динамико
  2. RangeExceptions - аналог DomainException. Вызывается так само, когда есть диапазон, значение похоже на правду, НО лошь. Разница в том, что тут мы пытаемся обратится к уже существующему массиву, в котором нету такого ключа(то есть, мы по-идее должны знать об этом.) ==> OutOfRange: мы имеем уже массив с 15 элем, и пытаемся взять 20й ключь (как я писал раньше, тут нету blackbox). В DomainException мы зачастую обращаемся к ф-и, мол выдай мне 20й индекс, а его там нету.(явный blackbox, поскольку мы вообще не знаем, что и как там хранится)
  3. OverflowException - когда нам нужно указать максимум 3 элем(пишем статью на 3 языка), а мы пытаемся туда втиснуть 4й
  4. UnderflowException - обратно, == мне нужно ПОЛЮБОМУ принять 3 языковые версии, чтобы передать их потом в БД, а я передаю только 1
  5. UnexpectedValueException - аналог InvalidArgumentException, только там мы получаем неправильные данные на входе, а тут - на выходе (данные, что вышли с-под ф-и не соответствуют тому, что мы ожидаем)

В PHP 7.2 завезли ещё несколько типов обработчиков, о них дочитать и доделать

Third-party source 2
Dropdown
test 123