profan
Новичок
обработка исключений и ошибок
Нужно чтоб ошибки и необработанные исключения обрабатывала спец функция (err2exc), а если есть блок try - catch исключение должно обрабатываться в нем
Например есть такой код:
если будет неправильный запрос то в этом случае исключение не попадает в catch так как pg_query() в DDR:query() возвращает ошибку и управление передается в err2exc(). Выходом в этом случае будет подавить ошибку @pg_query() и в err2exc() сделать проверку if ($PHP_ERROR AND (error_reporting() & $errno) === 0) return; тогда error_reporting() в err2exc() равно 0 и при проверки происходит выход из err2exc() и управление переходит в catch. А если блока try - catch нет, то управление возвращается обратно в err2exc() и тогда error_reporting() уже равно коду ошибки и исключение обрабатывает err2exc().
Все описанное это результат экспериментов, но решение выглядит как грязный хак.
Поэтому хотелось бы совета, как это реализовать правильно.
И еще непонятно почему несмотря на то что есть конструкция try - catch, управление передается не туда, а в exception hendler. Хотя в документации написано, что должно быть наоборот.
Нужно чтоб ошибки и необработанные исключения обрабатывала спец функция (err2exc), а если есть блок try - catch исключение должно обрабатываться в нем
Например есть такой код:
PHP:
class myException extends exception {
public function __construct($errno=null, $errstr=null, $errfile=null, $errline=null) {
parent::__construct();
$this->code = $errno;
$this->message = $errstr;
$this->file = $errfile;
$this->line = $errline;
}
}
function err2exc($errno, $errstr, $errfile, $errline) {
$PHP_ERROR = (func_num_args() === 5);
if ($PHP_ERROR AND (error_reporting() & $errno) === 0)
return;
echo $errno;
exit;
}
set_error_handler('err2exc', E_ALL & ~E_NOTICE & ~E_USER_NOTICE );
set_exception_handler('err2exc');
class DDR {
public function query($sql)
{
if (!$res = pg_query($this->conn, $sql))
throw new myException('database.error', pg_last_error().' - '.$sql);
return $res;
}
}
$dbr = new DDR();
try {
$result = $dbr->query($query);
}
catch (exception $e) {
echo $e->getMessage();
}
Все описанное это результат экспериментов, но решение выглядит как грязный хак.
Поэтому хотелось бы совета, как это реализовать правильно.
И еще непонятно почему несмотря на то что есть конструкция try - catch, управление передается не туда, а в exception hendler. Хотя в документации написано, что должно быть наоборот.