Výjimka v bootstrapu na vlastní error presenter?

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

Narazil jsem na problém, se kterým si nějak nevím rady. V bootstrapu vytvářím routy a jedna z nich je vlastní třída, která pracuje s jiným serverem či databází. Může se stát, že tento server není dostupný. V tomto případě mi objekt vyhodí výjimku a já bych chtěl v produkčním módu požít vlastní error presenter. catchExceptions mám na True, errorPresenter na název chybového presenteru.

Problém je v tom, že toto se zpracovává až v cyklu v application->run. Abych se do něj vůbec dostal, musel bych vytváření routy dát do try-catch bloku. Nevím ale, co bych tam dal za obsluhu. Když to nechám prázdné, tak se pokračuje dál v aplikaci, jako by chyba nenastala, tj. spustí se nějaký presenter. Takže bych v tom catch musel provést nějaké přesměrování na error presenter, ale nevím jak, když vlastně mám k dispozici jen application.

Když tu routu do try-catch nedám, tak v development modu mi hezky vyzkočí laděnka, ale v produkčním jen bílé nic (tj. normální odchycení výjimky a její zalogování a exit).

Jak teda správně v bootstrapu ještě přes spuštěním application->run odchytit výjimku tak, aby se nasměrovala na error presenter?

kravčo
Člen | 721
+
0
-

Petr Daňa napsal(a):

Narazil jsem na problém, se kterým si nějak nevím rady. V bootstrapu vytvářím routy a jedna z nich je vlastní třída, která pracuje s jiným serverem či databází. Může se stát, že tento server není dostupný. V tomto případě mi objekt vyhodí výjimku a já bych chtěl v produkčním módu požít vlastní error presenter. catchExceptions mám na True, errorPresenter na název chybového presenteru.

Problém je v tom, že toto se zpracovává až v cyklu v application->run. Abych se do něj vůbec dostal, musel bych vytváření routy dát do try-catch bloku. Nevím ale, co bych tam dal za obsluhu. Když to nechám prázdné, tak se pokračuje dál v aplikaci, jako by chyba nenastala, tj. spustí se nějaký presenter. Takže bych v tom catch musel provést nějaké přesměrování na error presenter, ale nevím jak, když vlastně mám k dispozici jen application.

Když tu routu do try-catch nedám, tak v development modu mi hezky vyzkočí laděnka, ale v produkčním jen bílé nic (tj. normální odchycení výjimky a její zalogování a exit).

Jak teda správně v bootstrapu ještě přes spuštěním application->run odchytit výjimku tak, aby se nasměrovala na error presenter?

V rýchlosti mi napadá riešiť vec lazy spôsobom, ak je to možné – t.j. pracovať so vzdialeným serverom až v metódach IRouter::match(), IRouter::constructUrl(). Z popisu predpokladám, že na vzdialený server sa pripájaš už v konštruktore…

Tým pádom by sa mala výnimka vyhodiť až po volaní Application::run().

Editoval kravco (17. 2. 2009 13:58)

Petr Daňa
Člen | 109
+
0
-

Díky, přesně tak, měl jsem tu komunikaci v konstruktoru. Přesunul jsem tedy vytvoření do match() a už to funguje jak má. Nevím, jestli je to ideální (správné) řešení, ale funguje, to je pro mě momentálně hlavní, takže ještě jednou díky. (Kruci, jaktože mě to taky nenapadlo, když je to tak jednoduchý? :) )

kravčo
Člen | 721
+
0
-

Petr Daňa napsal(a):

Díky, přesně tak, měl jsem tu komunikaci v konstruktoru. Přesunul jsem tedy vytvoření do match() a už to funguje jak má. Nevím, jestli je to ideální (správné) řešení, ale funguje, to je pro mě momentálně hlavní, takže ještě jednou díky. (Kruci, jaktože mě to taky nenapadlo, když je to tak jednoduchý? :) )

Dáta z externého servera sú pravdepodobne potrebné v oboch metódach routovacieho rozhrania, preto by asi bolo vhodné presunúť kód z konštruktora do samostatnej metódy, napríklad connect():

class MyRouter implements IRouter
{
    private $connected = FALSE;

    private function connect()
    {
        // connecting stuff...

        $this->connected = TRUE;
    }

    public function match(IHttpRequest $httpRequest)
    {
        if (!$this->connected) {
            $this->connect();
        }

        // matching stuff...
    }

    public function constructUrl(PresenterRequest $appRequest, IHttpRequest $httpRequest)
    {
        if (!$this->connected) {
            $this->connect();
        }

        // URL-constructing stuff...
    }
}