Fatal Error: "key does not exist on the server"

Fatal Error: "key does not exist on the server"

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

Fatal error: Uncaught exception 'CouchbaseException' with message 'The key does not exist on the server' in [CouchbaseNative]/CouchbaseBucket.class.php on line 196

此外,没有检查沙发底座上是否存在钥匙的规定。

我正在编写用于访问沙发底座的包装器。我已经完成了一半,只是为了从 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;
    }

}
?>

要求和用法:

<?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);
?>

如果现有密钥没有问题。它打印数据 received/fetched 并打印 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:已阅读下面提到的解决方案; none 他们工作了

从技术上讲,您不会捕获 任何 异常。

此代码:

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

永远不会捕获任何异常,因为它在 CouchBaseWrapper 下命名空间。本质上,它相当于写:

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

我假设不存在。

虽然这会起作用:

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

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

那应该开始捕获并回显异常...

然后我猜你想捕获 CouchbaseException(同样,使用正确的命名空间前缀),我猜这是抛出的 - 设计 - 当键不存在时......或者你可以在获取其值之前检查密钥是否存在(如果不存在,则 return 可能为 null)。

还要注意,如果你想捕获多个异常类型,你应该总是捕获 \Exception 最后,因为它们都继承自它,它会超过捕获继承的异常类型。

最后说明:如果您不想为所有异常添加前缀,您可以 "import" 使用例如use \Exception; 就像你对 CouchbaseCluster

所做的一样