Хора какви са тия изпълнения дето се опитвате да правите? Това със списъка с грешките е по-лоша практика и от връщането на false/-1 или PHP Errors
Идеята е ако извикам от някъде контролер,модел,вию или прсото базата данни се прецака да изтрещи това.
Правиш framework или се опитваш да го модифицираш? Защото ако ползваш нещо на готово и ти хвърля стандартните PHP грешки направо го сменяй докато е време.
Ексепшъните са направени точно за това, което ти трябва. Предполагам, че не можеш да си организираш кода така, че да ти е удобно да ги ползваш. Не знам до колко си наясно с тях, но идеята им е като възникне някъде грешка да хвърлиш съответния ексепшън, след което някъде нагоре по call stack-a да я хванеш. Като я хвърлиш кода се прекратява и върви нагоре докато стигне някъде до try ... catch блок, в който бива хваната. Ако не я хванеш никъде отива на най-високо ниво и прекратява целия скрипт.
PHP:
class InvalidParameter extends Exception
{
public $name, $value;
public function __construct($name, $value)
{
$this->name = $name;
$this->value = $value;
}
}
class DatabaseError extends Exception { }
class my_class
{
public function alabala()
{
try
{
$this->do_something();
}
catch (InvalidParameter $e)
{
// Има сгрешен параметър
// От InvalidParameter обекта можеш да вземеш информация ако си му дал
echo "Невалиден параметър с име" . $e->name . " и стойност " . $e->value;
}
catch (DatabaseError $e)
{
// Има проблем с БД
}
}
private function do_something()
{
/// Проверка на параметри и ако има грешка
throw new InvalidParameter($ime_na_parametara, $stoinost);
/// Пращане към БД и ако има грешка
throw new DatabaseError(); // Тук е най-добре класа дето ползваш за БД да си хвърля той грешките, пък ти да не се занимаваш с това
/// Код ако няма грешки никъде
..... // Това няма да се изпълни нещо ако хвърли грешка по-нагоре
}
}
Добра практика е например да имаш на най-високо ниво един try/catch, който да хваща всякакви НЕхванати ексепшъни и да показва грешка от рода на "Нещо лошо се случи". Иначе идеята е да хващаш грешките където можеш да ги поправиш по някакъв начин или да изведеш съобщение и да прекратиш скрипта.
Ако БД се прецака и ползваш нещо подобно на PDO/mysqli то самото ще хвърли ексепшън, който ако не го хванеш сам ще спре скрипта. Но както казах вече най-добре ако не е хванат до най-високото ниво на кода ти да го хванеш и изпишеш някаква обща грешка. Иначе показваш на потребителя цялата информация за грешката.
Друг проблем при PHP за разлика от други езици е, че се намесват и стандартните PHP Errors. Ето с този код можеш PHP грешките и warning-ите да ги обърнеш на exceptions, които се хвърлят от мястото на обикновената грешка:
PHP 5.2
PHP:
set_error_handler(create_function('$a,$b,$c,$d', 'throw new ErrorException($b, 0, $a, $c, $d);'),
E_ERROR | E_WARNING | E_RECOVERABLE_ERROR | E_USER_ERROR | E_USER_WARNING
);
или по-добрия вариант при PHP 5.3
PHP:
set_error_handler(
function($a, $b, $c, $d)
{
throw new ErrorException($b, 0, $a, $c, $d);
},
E_ERROR | E_WARNING | E_RECOVERABLE_ERROR | E_USER_ERROR | E_USER_WARNING
);