2011-12-31 2 views
0

Silex, похоже, захватывает исключения, брошенные в любом месте приложения. Моя проблема заключается в том, что у меня есть класс user_db_interface, который я использую для передачи/получения пользовательских данных из моей базы данных, которые в основном игнорируются после исключения исключения.Ищет переопределение исключения Silex

Например, если у меня есть повторяющаяся запись электронной почты пользователя, которая генерирует исключение PDOException, вместо того, чтобы обрабатывать это исключение в моем классе, я должен добавить закрытие обработки ошибок вне моего класса. Я предпочел бы иметь дело с исключением изнутри, чтобы я мог действовать в этом исключении и продолжить свой сценарий.

Любые такие вещи, как исключение или обход?

Вот пример:

###### PROVIDER REG ####### 
// I'M LOADING DOCTRINE "NATURALLY" AND NOT REGISTERING IT WITH $APP IN HOPES OF 
// AVOIDING THE EXCEPTION HIJACKING. 
################################################################### LOAD DOCTRINE NATURAL 

require 'vendor/Doctrine/Common/ClassLoader.php'; 

$classLoader = new \Doctrine\Common\ClassLoader('Doctrine', __DIR__ . '/../vendor'); 
$classLoader->register(); 

$connectionOptions = array(
    'driver' => 'pdo_mysql', 
    'dbname' => 'MY_DB', 
    'host'  => 'localhost', 
    'password' => 'MY_PASS', 
    'user'  => 'MY_USER', 
); 

$driver = new \Doctrine\DBAL\Driver\PDOMySql\Driver; 
$connection = new \Doctrine\DBAL\Connection($connectionOptions, $driver); 

###################################################################### LOAD MY EXTENSION 
$app['autoloader']->registerNamespaces(array('TableTrackPro' => __DIR__,)); 

$app->register(new TableTrackPro\ClientDBInterfaceExtension(),array('app'=>$app)); 
$app['client_db_interface']->set_connection($connection); 


################################################## 
################################################## 

################################################# MY DB INTERFACE CLASS (stripped for clarity) 

namespace TableTrackPro; 

class ClientDBInterface{ 

    private $_connection; 

    public function set_connection($connection){ 
     $this->_connection = $connection; 
    } 

    public function insert_client($clientInfo){ 
     // SET RETURN OBJECT 
     $returnObject['status'] = 'ok';  // default return status 
     $returnObject['message'] = false; 


// SANITIZE CLIENT INFO ETC... 

// THIS IS WHERE I WOULD LIKE TO HANDLE MY OWN EXCEPTIONS 
    try{ 
     $this->_connection->insert('clients', $clientInfo); 
    }catch(PDOException $e){ 
     // HANDLE EXCEPTION HERE 
    } 
    return json_encode($returnObject); 
} 


#### END CLASS ##### 


### CONTROLLERS #### 

$app->post('/postNewClient', function() use($app){ 
    $clientInfo = $_POST; 
    $returnObject = $app['client_db_interface']->insert_client($clientInfo); 
    return json_encode($returnObject); // <-- I handle this object with javascript via an AJAX call 
}); 

Вместо обработки PDOException в моем классе, так что я могу вернуть данные, как я хочу, я должен добавить обработчик ошибок в области контроллера как:

$app->error(function (\Exception $e, $code) { 
    // error handling code, I'd now have to handle any client-db specific errors outside of my client_db class... 
}); 

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

+0

Трудно сказать, где вы пытаетесь поймать ошибку. Можете ли вы показать минимальный пример с 'app.php' и' MyClass.php' и объяснить, где вы хотите поймать ошибку? – igorw

+0

@igorw, я добавил небольшой пример к вопросу выше. Дайте мне знать, если это поможет. –

ответ

5

Хорошо, поэтому единственное, что делает silex, - это исключение при вызове $app->run(). В этом нет ничего, что мешало бы вам раньше поймать исключение.

Я подозреваю, что ваша проблема вызвана следующим. Предполагая, что ваш код на самом деле:

try{ 
    $this->_connection->insert('clients', $clientInfo); 
}catch(PDOException $e){ 
    // HANDLE EXCEPTION HERE 
} 

Ну, дело в том, что вы находитесь в классе с именами. Это означает, что все имена классов относятся к текущему пространству имен. Чтобы ссылаться на глобальное пространство имен, вам необходимо указать use или префикс их \.

Что вам нужно сделать, это:

try{ 
    $this->_connection->insert('clients', $clientInfo); 
}catch(\PDOException $e){ 
    // HANDLE EXCEPTION HERE 
} 

это Решает ли проблема?

+0

Интересно. У моего файла index.php есть запрос и $ app-> run(). Я предполагаю, что тогда мне нужно перехватить мой запрос сценарием, который НЕ имеет вызов $ app-> run(). Позвольте мне попробовать, и я дам вам знать. –

+0

Как я уже сказал, исключения задерживаются на самом деле очень поздно. Если у вас есть блок try-catch выше в стеке, он должен работать нормально. Не нужно изменять работу '$ app-> run()'. – igorw

+0

Igor, вы на 100% верны, это даже не вызов $ app-> run, это был факт, что я был в классе с именами и не использовал «\». –