Chytání výjimek, dynamické načítání tříd
- kuncajs
- Člen | 11
Zdravím,
mám takové dva problémy, se kterými si nevím moc rady.
- Připojuji se k databázi pomocí Dibi. Ovšem přihlašovací údaje smí zadat i uživatel, a proto může vzniknout chyba a nemožnost připojení. V této chvíli chci přepnout systém do kritického režimu. můj kód je:
namespace Albireo\Modules;
use Albireo\Mode;
use Nette\Environment;
use Dibi;
abstract class DatabaseModule implements IModule {
public static function initialize($settings = null) {
try {
dibi::connect(
Environment::getConfig('database')
);
} catch (DibiDriverException $e) {
Mode::setCriticalMode();
}
}
Ovšem pokud zvolím např. špatný název databáze na serveru, systém se mi přesune do Laděnky s hláškou DibiDriverException #1049. Podle mých zkušeností jsem měl výjimku zachytit já a ne ji nechat probublat až do Laděnky. Poradíte mi někdo?
- Druhý problém mám, že volám něco ve smyslu
$activedb = "MySQL";
$activedb::initialize();
což je legitimní zápis, ale Nette mi oznámí, že class ‚MySQL‘ not
found.
Zatímco Mysql::initialize(); funguje tak, jak má.
(Ten kod v b) není kompletní, jde mi o zvolení databáze podle nastavení
na serveru), ale pro ilustraci snad stačí.
Budu rád za každý hint, děkuji :)
- Mikulas Dite
- Člen | 756
Jestli máš v bootstrapu nastavenou aplikaci na
aplication->catchExceptions = true
, možná jí to zachycuje
dřív než tvůj blok (ale netestoval sem, je to pravda?). Zkus dát
catchExceptions
na false. K tomu druhýmu, máš tam jiný
velikosti písem, to by mělo být zásadní.
- redhead
- Člen | 1313
u té 1) mě napadá, nemáš lazy způsob konektování k DB (tj. v configu lazy = TRUE)???
jinak to jak nette s výjimkami nakládá v aplikaci nemá nic společnýho s normálním fungovaní PHP, čili pokud něco vyhodí vyjímku, ta musí být BEZPODMÍNEČNĚ chycena prvním blokem try-catch úrovni nad ní. Zkus ještě odchytávat obecnou výjimku DibiException (teda doufám, že existuje, nevím). Ale mělo by to normálně jít.
- Ondřej Mirtes
- Člen | 1536
Není to legitimní zápis, protože seš ve svém namespace. Musíš napsat
\MySQL
. Doporučuji tohle vlákno
- kuncajs
- Člen | 11
Mno tak 1 už jsem vyřešil… Zdá se, že try catch ve statické metodě
není vůbec vyvolán (?)
Mám to napsané tak, že v souboru loader.php načítám svou vlastní
knihovnu. Ta volá podle nastavené databáze například Mysql::initialize
(která ještě volá další obecnou třídu a její statickou metodu – má
to svůj smysl nebojte, něco jako Decorator – delegování :) ) pokud
výjimku chytám v jedné z těchto statických metod, výjimka mi uteče, ale
pokud přímo v tom loaderu obalím Mysql::initialize(), tak se stane to, co
chci, tedy spustím kritický režim.
Je chyba v Nette nebo ve mně? :)
Zmátl mě totiž Stack, který správně hlásil, že vyjímka byla vyhozena obalená v try – catch, ale chycena nebyla, a proto jsem musel try – catch hodit až mimo statickou metodu, a pak je vše OK.
//EDIT: zdá se, že je chyba ve mně a Ondra Mirtes mi dal dostatečné ponaučení kvůli namespaces :-) A to jsme to začali používat v projektu kvůli přehlednosti :) Zdá se, že stačí \DibiDriverException $e a je vše v pořádku. Děkuju moc :) Tu dvojku zkusím ještě poupravit
Editoval kuncajs (4. 3. 2010 20:10)