tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

GURU vypis chyby

před 10 lety

JanVan
Člen | 2

Ahojte, řeším výpis chyby když se nepodaří připojit k db. Cílem je zobrazit chybovou hlášku na novou prázdnou stránku a ne do struktury zobrazovaných stránek. Důvod? Většina webových stránek nemá bez dat z databáze význam (např. blog).

Můj nápad:

<?php
    try {
            dibi::connect(array(
                'driver'   => 'mysql',
                'host'     => 'localhost',
                'username' => 'jmeno',
                'password' => 'heslo',
                'charset'  => 'utf8',
            ));
        } catch (DibiException $e) {
            session_start();

            $_SESSION['errMessage'] = "Došlo k chybě při připojování databáze.";
            header("Location: ./fatal_error.php");
            exit();
        }
?>

Stránka fatal_erorr.php je jednoduchá html stránka, kde se zobrazí ze session získaná zpráva errMessage. Problém je, že se mi tento způsob zdá poněkud kostrbatý a nevím jestli ideální – otvírat session a přesměrovávat na jinou stránku. Jak to vidíte vy? Je to dobré řešení nebo znáte nějaké guru (raději jeden geniální nápad, než 10.000 hloupých řádků kódu)?

Dík za Váš čas věnovaný tomuto scriptíku.

Editoval JanVan (14. 11. 2009 19:39)

před 10 lety

deric
Člen | 93

Nette jde toto elegantně pomocí ErrorPresenteru, tedy třídy, která zobrazuje chyby a záleží už na tvé obsluze kolik informací uživateli zobrazíš.

Nevýhoda tvojeho řešení je, že tyto řádky kódu musíš pořád opisovat dokola, což může být zdrojem chyb a také to není objektový přístup. Korektní řešení v tomto případě je nechat obsluhu vyjímky na vyšší vrstvě, tedy nenapsat vůbec žádnou obsluhu (na této úrovni).

Nenutím tě používat Nette, stačí se podívat na exception handler

Editoval deric (16. 11. 2009 17:24)

před 10 lety

JanVan
Člen | 2

Už jsem si to ujasnil „pochopením“ modelu MVC. V praxi to s presentry jeste neni ono, ale snad to zmáknu pochopit a správně používat. S nette a objektovým PHP právě začínám. Zkušenost mám pouze s objektovou Javou.

před 10 lety

deric
Člen | 93

Výborně, není špatný nápad začít čtením dokumentace. Ukázkový kód pro ErrorPresenter je součástí distribuce Nette: nette/tools/Skeleton/app/presenters/ErrorPresenter.php

pak je potřeba nastavit tento presenter v bootstrapu:

$application = Environment::getApplication();
$application->errorPresenter = 'Error';

před 10 lety

v6ak
Člen | 206

Dodám, že IMHO není dobře uživateli říkat podrobnosti.

Co uživatele může zajímat? Akorát to, že to momentálně nejede. A taky že to není jeho chyba, ale chyba na straně serveru. To je vše, co uživatele může zajímat.

Technické podrobnosti mohou zajímat nejspíš správce/programátora (ten se to ale může dozvědět z logů nebo přes mail) a nějakého útočníka. (Tím nechci říct, že konkrétně z informace „Nepodařilo se připojit k DB“ toho může útočník hodně získat.)

před 10 lety

hurvajs
Člen | 86

deric napsal(a):

Nette jde toto elegantně pomocí ErrorPresenteru, tedy třídy, která zobrazuje chyby a záleží už na tvé obsluze kolik informací uživateli zobrazíš.

Nevýhoda tvojeho řešení je, že tyto řádky kódu musíš pořád opisovat dokola, což může být zdrojem chyb a také to není objektový přístup. Korektní řešení v tomto případě je nechat obsluhu vyjímky na vyšší vrstvě, tedy nenapsat vůbec žádnou obsluhu (na této úrovni).

Nenutím tě používat Nette, stačí se podívat na exception handler

Nicmene jako priklad zachyceni chyb je Nette dobre, resp. Ladenka. Jinak pozor, Nette neni MVC, ale MVP – coz je hodne podobne, ale jine. Sam p. Grudl se o tom zminuje, myslim v serialu na zdrojaku.

Obecne bych spise snazil porozumet MVC a pak teprve koukat na nejaky framework. Ikdyz uprimne, ani Nette, ani ZF neni 100% MVC (predevsim diky formularum… ).

Podle me zadne nejlepsi guru reseni na chyby neni. Je jich par dobrych, ale zalezi na programatorovi. Ja osobne mohu doporucit Ladenku (pro devel mod) jinak nejaky svuj vlastni Error(View/Presenter). Zalezi na Tobe.