Перехват PDOException на нижнем уровне и повторное выбрасывание как другое исключение для верхнего уровня - PullRequest
3 голосов
/ 14 марта 2012

Здравствуйте. Я пишу небольшой PHP-фреймворк с использованием библиотеки PDO.Так что в данный момент я сталкиваюсь с проблемой ловли исключений.Я хочу поймать выброшенное исключение PDOException на нижнем уровне и повторно выдать его как другой объект исключения, а затем передать его на верхний уровень, скрывая конфиденциальную информацию об ошибках от пользователей и отображая абстрактные полезные сообщения для администраторов сайта и т. Д. В примере кода(Mssql.class.php) Я пытаюсь перехватить исключение и повторно выдать объект DBIException, когда невозможно установить соединение с базой данных (например, неверное имя хоста или имя пользователя).

В верхнем слое я пытаюсь перехватить DBIException (DBI.class.php) и повторно выдать его как объект CoreException.В последнем слое (SystemLoader.class.php) я пытаюсь перехватить CoreException и распечатать соответствующее сообщение.Как видно из кода, основной класс инициализации (SystemLoader.class.php) и метод init () выполняются из index.php, но если в нижних уровнях возникает ошибка PDOException, я получаю неустранимую ошибку: Uncaught исключение 'PDOException', а не CoreException с сообщением«Системе не удалось загрузить указанные ресурсы», как я и ожидал.Но если я помещаю System :: init () в index.php между блоком try..catch, ловится исключение, но не исключение DBIException или CoreException только PDOException.

Похоже, что механизм перехвата почему-то не отвечает на попытку ... блокировать блоки на более низком уровне, а другая вещь - я не хочу использовать блоки try ... ... в файле index.phpпросто я не хочу делать эту файловую структуру сложной.Я прочитал много информации в Интернете и понял концепцию обработки исключений, но в данный момент я не знаю, где я делаю ошибку.Должен ли я установить пользовательский обработчик исключений в SystemLoader.class.php или использовать другие методы

index.php

<?php
    require_once("SystemLoader.class.php");
    System::init();                   //initializing system params and other stuff
?>

SystemLoader.class.php

<?php
    require_once("DBIException.class.php");

    class SystemLoader
      {
        static function init()
          {
            try
               {
                 DBI::loadDBDriver("mssql");    //trying to load DB driver
               }
            catch(CoreException $e)
               {
                 echo "System couldn't load specified resources";
               }
         }
      }
?>

DBI.class.php

<?php

require_once("CoreException.class.php");

class DBI
  {    
    private $dbh;

    public static function loadDBDriver($dbDriver)
      {
        if($dbDriver = "mssql")
          {
            try 
               {
                 return new Mssql;
               } 
            catch (DBIException $e) 
               {
                 throw new CoreException($e)
               }
          }
        elseif($dbDriver = "mysql")
          {
            try 
               {
                 return new Mysql;
               } 
            catch (DBIException $e) 
               {
                 throw new CoreException($e)
               }
          }
      }

    public function setDBHandle($dbh)
     {
        $this->dbh = $dbh;
        $this->dbh->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_EMPTY_STRING);
        $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
     }
 }

Mssql.class.php

<?php
    require_once("DBIException.class.php");

class Mssql extends DBI
  { 
    public function __construct()
      {
       try 
          {
             $dbh=new PDO("dblib:host=192.168.0.1;Database=dbName", "user", "pass");
             parent::setDBHandle($dbh);
          }
       catch(PDOException $e)         //PDOException is not catched at this point
         {
             throw new DBIException($e);    /re-throw as new Exception object
         }
      }
  }
?>

CoreException.class.php

<?php
   class CoreException extends Exception {}
?>

DBIException.class.php

<?php
   class DBIException extends Exception {}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...