Есть способ проверить с помощью «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
.
Поэтому вам нужно сделать две вещи:
Вы можете достичь первого с помощью 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
, и это не очень хорошая практика). Поэтому для решения, которое не только работает, но и прекрасно спроектировано, вы должны упаковать все это в классе. Этот класс определит:
my_error_handler
в приведенном выше примере). Чтобы установить метод объекта как обработчик ошибок вместо глобальной функции, вам нужно вызвать set_error_handler
с подходящим первым параметром; см. документацию для callback
. callback
предоставляемый вашим кодом вызова, и массив параметров и использовать call_user_func_array
для его выполнения. Если во время выполнения вызывается обработчик ошибок из # 1 выше, пометьте это в переменной в вашем объекте. Ваш метод вернет возвращающее значение call_user_func_array
к вызывающему коду. Итак, если этот класс называется 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 может сказать вам, почему это не удалось.