Почему клиент couchbase для php выдает фатальную ошибку
Фатальная ошибка: Uncaught исключение «CouchbaseException» с сообщением «Ключ не существует на сервере» в [CouchbaseNative] /CouchbaseBucket.class.php в строке 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);
?>
В случае существующего ключа проблем нет. Он печатает полученные / извлеченные данные и печатает Outter Code
также. Но если запрос относится к несуществующему ключу, он вылетает и не печатает Outter Code
,
Я попробовал существует функция. Ниже приведен код (идет в файле ‘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: Уже прочитал решение, указанное ниже; никто из них не работал
Технически, ты не ловишь любой исключение.
Этот код:
try{
// ...
}
catch(Exception $e){
echo $e;
}
никогда не поймает никаких исключений, потому что это пространство имен в CouchBaseWrapper. По сути, это эквивалентно написанию:
try{
// ...
}
catch(\CouchBaseWrapper\Exception $e){
echo $e;
}
Который я предполагаю, не существует.
Это будет работать, хотя:
try{
// ...
}
catch(\Exception $e){
echo $e;
}
(Обратите внимание \
в начале, который приведет вас к пространству имен верхнего уровня, где определено исключение).
Это должно начать ловить и повторить исключение …
Тогда я думаю, вы хотите поймать CouchbaseException
(опять же, с правильным префиксом пространства имен), который, как я предполагаю, генерируется — по замыслу — когда ключ не существует … или вы можете проверить, существует ли ключ, прежде чем получить его значение (и, возможно, вернуть null, если он не существует). «т).
Также обратите внимание, если если вы хотите перехватить несколько типов исключений, вы всегда должны перехватывать \ Exception last, поскольку все они наследуются от него, это перехватит перехват унаследованных типов исключений.
Последнее замечание: если вы не хотите добавлять префиксы ко всем вашим исключениям, вы можете просто «импортировать» их, например, с помощью use \Exception;
как ты сделал с CouchbaseCluster
Других решений пока нет …