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