为什么用于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 :已经阅读了下面提到的解决方案;他们都没有工作
答案 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