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

Здравствуйте, я пишу небольшой 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.

Похоже, что механизм перехвата почему-то не отвечает на попытку ... ловить блоки на более низком уровне, а другое дело в том, что я не хочу использовать попытку ... ловить блоки в файле 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 {}
?>

Ответы на вопрос(0)

Ваш ответ на вопрос