Чекирование и ошибка в функции PHP

Есть способ проверить с помощью «IF», если функция сбой в php?

Ex.

If (getimagesize($image) returns and error) { echo 'Error: function dont work'; } else { // do something } 

Благодаря!

Я предполагаю, что вас интересует именно функция, такая как getimagesize , которая не возвращает никаких кодов ошибок и затрудняет нам работу. Но не невозможно.

Документация для состояний getimagesize :

Если доступ к изображению имени файла невозможен, или если он не является допустимым изображением, getimagesize() будет генерировать ошибку уровня E_WARNING . При ошибке чтения getimagesize() генерирует ошибку уровня E_NOTICE .

Поэтому вам нужно сделать две вещи:

  1. Получать уведомление об ошибке и воздействовать на нее как-то
  2. Не показывать ошибку или вообще не влиять на выполнение вашей программы (в конце концов, вы сами будете заботиться о любых ошибках с кодом обработки ошибок)

Вы можете достичь первого с помощью set_error_handler() и restore_error_handler() . Вы можете достичь второго с помощью оператора @ управления ошибками .

Итак, код должен выглядеть примерно так:

 // Set our own error handler; we will restore the default one afterwards. // Our new error handler need only handle E_WARNING and E_NOTICE, as per // the documentation of getimagesize(). set_error_handler("my_error_handler", E_WARNING | E_NOTICE); // No error has occured yet; it is the responsibility of my_error_handler // to set $error_occurred to true if an error occurs. $error_occurred = false; // Call getimagesize; use operator @ to have errors not be generated // However, your error handler WILL STILL BE CALLED, as the documentation // for set_error_handler() states. $size = @getimagesize(...); // At this point, my_error_handler will have run if an error occurred, and // $error_occurred will be true. Before doing anything with it, restore the // previous error handler restore_error_handler(); if($error_occurred) { // whatever } else { // no error; $size holds information we can use } function my_error_handler($errno, $errstr, $file, $line) { global $error_occurred; // If the code is written as above, then we KNOW that an error // here was caused by getimagesize(). We also know what error it was: switch($errno) { case E_WARNING: // Access to image impossible, or not a valid picture case E_NOTICE: // Read error } // We could also check what $file is and maybe do something based on that, // if this error handler is used from multiple places. However, I would not // recommend that. If you need more functionality, just package all of this // into a class and use the objects of that class to store more state. $error_occurred = true; return true; // Do not let PHP's default error handler handle this after us } 

Конечно, это не очень $error_occurred (у вас есть глобальная переменная $error_occurred , и это не очень хорошая практика). Поэтому для решения, которое не только работает, но и прекрасно спроектировано, вы должны упаковать все это в классе. Этот класс определит:

  1. Метод, реализующий обработчик ошибок ( my_error_handler в приведенном выше примере). Чтобы установить метод объекта как обработчик ошибок вместо глобальной функции, вам нужно вызвать set_error_handler с подходящим первым параметром; см. документацию для callback .
  2. Метод, который позволяет классу установить обработчик ошибок, выполнить какой-либо код по вашему выбору, сохранить флаг «ошибка при выполнении вашего кода» и восстановить обработчик ошибок. Этот метод может, например, выполнить callback предоставляемый вашим кодом вызова, и массив параметров и использовать call_user_func_array для его выполнения. Если во время выполнения вызывается обработчик ошибок из # 1 выше, пометьте это в переменной в вашем объекте. Ваш метод вернет возвращающее значение call_user_func_array к вызывающему коду.
  3. Метод или переменная, которую вызывающий код может использовать для доступа к результату из # 2 выше.

Итак, если этот класс называется ErrorWatcher, ваш код вызова будет выглядеть примерно так:

 $watcher = new ErrorWatcher; $size = $watcher->watch("getimagesize", array( /* params for getimagesize here */ )); // $size holds your result, if an error did not occur; // check for errors and we 're done! switch($watcher->report_last_error()) { // error handling logic here } 

… который хорош и опрятен и не вмешивается в глобальные переменные. Надеюсь, я объяснил это достаточно хорошо, чтобы вы могли самостоятельно написать класс ErrorWatcher. 🙂

Взгляните на исключения . Однако вам придется бросить их в свою функцию.

Изменить: Кстати, если ваша функция не должна возвращать логическое значение, вы всегда можете вернуть ее, если что-то пойдет не так, и проверьте:

 $result = getimagesize($image); if ($result === false) { // } 

Каким бы ни было условие в выражении «если» (то, что находится в круглой скобке), возвращается «истина» или «ложь». Если условие возвращает «true», первый оператор будет выполнен, иначе второй оператор будет выполнен.

Вы можете указать это, error_reporting (E_ALL); на самом верху вашего скрипта, сразу после вашего php-тега, чтобы узнать, какую ошибку вы получите.

Надеюсь, поможет.

Может быть, что-то вроде этого:

 <?php error_reporting(E_ALL); more stuff here ... if(your condition here){ echo "condition is true, do something"; }else{ echo "condition is not true, do something else"; } 

если функция или оператор, который вы запускаете внутри «if» или «else», терпят неудачу, по крайней мере, вы знаете, какой из них был основан на результате, а error_reporting может сказать вам, почему это не удалось.