【问题标题】:Looking for a Silex Exception Override寻找 Silex 异常覆盖
【发布时间】:2011-12-31 23:28:39
【问题描述】:

Silex 似乎劫持了应用程序中任何地方引发的异常。我的问题是我有一个 user_db_interface 类,用于从我的数据库传递/获取用户数据,一旦引发异常,该类基本上会被忽略。

例如,如果我有一个生成 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 类内部,我会知道该错误也是特定于该操作的,我不必编写错误解析器。

【问题讨论】:

  • 很难判断你在哪里试图捕捉错误。您能否展示一个带有app.phpMyClass.php 的最小示例,并说明您想在哪里捕获错误?
  • @igorw,我在上面的问题中添加了一个小例子。让我知道这是否有帮助。

标签: silex


【解决方案1】:

好的,所以 silex 唯一能做的就是在 $app-&gt;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
}

这能解决您的问题吗?

【讨论】:

  • 有趣。我的 index.php 文件有 require 和 $app->run()。我想我必须用一个没有 $app->run() 调用的脚本来拦截我的请求。让我试一试,我会告诉你的。
  • 正如我所说,异常被捕获到很晚。如果您在堆栈中的较高位置有一个 try-catch 块,它应该可以正常工作。不需要改变$app-&gt;run() 的工作方式。
  • 伊戈尔,你是 100% 正确的,这甚至不是 $app->run 调用,这是我在命名空间类中而不使用“\”的事实。跨度>
  • 这让我很伤心。一开始的 \ 为我解决了它。谢谢!
  • 我觉得自己很笨。我刚刚在我的应用程序的另一部分再次遇到了这个问题,并开始寻找解决方案。我很高兴找到这个答案并投票赞成。哦,我已经投票了。不能再做了。呃。也许这次我会记住答案。
猜你喜欢
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 2019-12-28
  • 2018-05-23
  • 2019-08-26
相关资源
最近更新 更多