Почему Try / Catch не работает в функции подключения phpredis? - PullRequest
7 голосов
/ 27 марта 2012

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

<?php
    $redis=new Redis();
    try {
        $redis->connect('127.0.0.1', 6379);
    } catch (Exception $e) {
        // tried changing to RedisException, didn't work either
        // insert codes that'll deal with situations when connection to the redis server is not good
        die( "Cannot connect to redis server:".$e->getMessage() );
    }
    $redis->setex('somekey', 60, 'some value');

Но когда сервер Redis не работает, я получил

    PHP Fatal error:  Uncaught exception 'RedisException' with message 'Redis server went away' in /var/www/2.php:10
Stack trace:
#0 /var/www/2.php(10): Redis->setex('somekey', 60, 'some value')
#1 {main}
  thrown in /var/www/2.php on line 10

Код блока catch не был выполнен. Я вернулся, чтобы прочитать документ phpredis, и вместо этого придумал следующее решение

<?php
    $redis=new Redis();
    $connected= $redis->connect('127.0.0.1', 6379);
    if(!$connected) {
        // some other code to handle connection problem
        die( "Cannot connect to redis server.\n" );
    }
    $redis->setex('somekey', 60, 'some value');

Я могу с этим смириться, но мое любопытство никогда не будет удовлетворено, поэтому возникает мой вопрос: почему метод try / catch не работает с ошибкой соединения?

Ответы [ 3 ]

4 голосов
/ 27 марта 2012

Ваше исключение было отправлено из setex, который находится за пределами блока try {}.Поместите setex в блок try, и исключение будет перехвачено.

1 голос
/ 28 марта 2012

Как сказал Николас, исключение происходит от setex, но вы можете избежать этого (и даже блока try / catch), используя команду ping:

$redis=new Redis();
$redis->connect('127.0.0.1', 6379);

if(!$redis->ping())
{
    die( "Cannot connect to redis server.\n" );
}

$redis->setex('somekey', 60, 'some value');
0 голосов
/ 24 апреля 2019

Он сможет перехватить исключение подключения, если вы перехватите «\ Predis \ Connection \ ConnectionException».

Или вы можете использовать \ Exception вместо Exception (обратите внимание на косую черту спереди).

...