Chytání výjimek, dynamické načítání tříd

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
kuncajs
Člen | 11
+
0
-

Zdravím,
mám takové dva problémy, se kterými si nevím moc rady.

  1. 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?

  1. 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
+
0
-

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í.

kuncajs
Člen | 11
+
0
-
  1. Bohužel žádný úspěch :-(
  2. To jsem se přepsal jen tady, omlouvám se, ale stejně PHP je case sensitive jen u proměnných u funkcí a tříd ne. Takže ani tak by asi neměl být problém.

Děkuju za snahu a rychlou odpověď.

redhead
Člen | 1313
+
0
-

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
+
0
-

Není to legitimní zápis, protože seš ve svém namespace. Musíš napsat \MySQL. Doporučuji tohle vlákno

kuncajs
Člen | 11
+
0
-

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)