致命错误:“服务器上不存在密钥”

时间:2015-05-06 11:38:55

标签: php couchbase

为什么用于php的couchbase客户端会抛出致命错误

  

致命错误:在第196行的[CouchbaseNative] /CouchbaseBucket.class.php中显示消息'CouchbaseException',并显示消息'服务器上没有该密钥'

此外,没有规定检查基座上是否存在钥匙。

我正在编写一个用于访问couchbase的包装器。我只是为了阅读来自couchbase的数据。但我发现了这个问题;当我试图访问一个不存在的密钥时,它会抛出致命错误并导致代码崩溃(不会进一步执行)。

下面是代码(文件'couchbaseWrapper.php'):

<?php namespace CouchBaseWrapper;
 use \CouchbaseCluster;

class CouchDB {    
    private $couchClient;
    private $couchBucket;

    private function openConection(){
        try{
            $this->couchClient = new CouchbaseCluster(<COUCH_HOST>);
            $this->couchBucket = $this->couchClient->openBucket(<COUCH_BUCKET>);
        }
        catch (Exception $e) {
            echo $e;
        }
        return true;
    }

    function getKey($k) {    
        try{
            if(!$this->openConection()) { return false; }

            $res = $this->couchBucket->get($k);
            $data_rcvd = $res->value;
        }
        catch(Exception $e){
            echo $e;
        }        
        echo "Outter Code";
        return $data_rcvd;
    }

}
?>

要求&amp;用法:

<?php namespace CouchBaseWrapper

ini_set("display_errors", true);

require_once('couchbaseWrapper.php');

$cb = new CouchDB();
$result = $cb->getKey("non-existing-key"); // <== Error
//$result = $cb->getKey("existing-key");   // <== Existing key No error

var_dump($result);
?>

如果现有密钥没有问题。它确实打印接收/提取的数据并打印Outter Code。但是,如果请求是针对不存在的密钥,那么它会崩溃并且不会打印Outter Code

我尝试了exists功能。以下是代码(进入文件'couchbaseWrapper.php'):

public function exists($key) {
    if(!$this->openConection()) { return false; }
    return $this->couchBucket->get($key) == NULL 
    && $this->couchBucket->getResultCode() == COUCHBASE_KEY_ENOENT;
}

没有得到任何东西。我正在使用Couchbase Version 2.0.7。非常感谢任何形式的帮助。

P.S :已经阅读了下面提到的解决方案;他们都没有工作

1 个答案:

答案 0 :(得分:2)

从技术上讲,您没有捕获任何例外。

此代码:

    try{
        // ...
    }
    catch(Exception $e){
        echo $e;
    }      

永远不会捕获任何异常,因为它在CouchBaseWrapper下被命名空间。从本质上讲,它等同于写作:

    try{
        // ...
    }
    catch(\CouchBaseWrapper\Exception $e){
        echo $e;
    }      

我假设不存在。

这会有效:

    try{
        // ...
    }
    catch(\Exception $e){
        echo $e;
    }      

(注意开头的\,它将您带到定义了Exception的顶级命名空间。)

应该开始捕捉并回应异常...

然后我想你想要抓住CouchbaseException(再次,使用正确的命名空间前缀),我猜测它被抛出 - 按设计 - 当一个密钥不存在时......或者你可以检查一下密钥在获取其值之前存在(如果不存在则返回null)。

另请注意,如果要捕获多个异常类型,则应始终捕获\ Exception,因为它们都从它继承,它将超越捕获继承的异常类型。

最后注意事项:如果您不想为所有例外添加前缀,则可以使用例如“导入”它们。 use \Exception;就像您使用CouchbaseCluster

一样