Pomoć oko PHP Exceptiona

Pozdrav ljudi, trebao bih malu pomoć, tj. objašnjenje oko PHP Exceptiona.

Znači, napravio sam abstraktnu klasu BaseException koja extenda Core PHP Exception klasu. Zatim sam napravio više vrsta Exception klasa tipa DatabaseException, FileException, ControllerException koje extendaju BaseException klasu.

Primjer 1: Spajam se na bazu, greška prilikom spajanja:

throw new DatabaseException("Error while trying to connect to database!");

Primjer 2: Problem s izvršavanjem nekog SQL querija

throw new DatabaseException("Error while trying to fetch data from database! Query: " . $query);

Primjer 3: Problem s učitavanjem fajla s diska

throw new FileException("Error while reading " . $file . " file from disc!");

E sad me zanima gdje handleati te Exceptione ? Radim neki svoj MVC koji radi na slijedeći način (init/bootstrap file):

// create new router
$router = $container->get('Router');
$router->import('Config/routes.php');

// run the router
$router->route();

// load controller
$dispatcher = $container->get('Dispatcher');
$dispatcher->load();

Zatim se tu loada controller i action, nakon toga se poziva repository layer (baza podataka) koji vraća podatke u controller koji zatim šalje te iste podatke na view.

Možda staviti try { (ovaj gore dio) } i onda ispod:

} catch (DatabaseException $e) {
    echo "Database error!" . $e->getMessage();
    $log->log('Database error', $e->getMessage());
    $mail->sendMail("[email protected]", $e->getTitle(), $e->getMessage());
} catch (FileException $e) {
    echo "File error!" . $e->getMessage();
    $log->log('File error', $e->getMessage());
} catch (Exception $e) { // default
    echo "Some exceptional error!" . $e->getMessage();
    $log->log('Default exception', $e->getMessage());
}

Ili unutar svaki controller (gdje bude potrebno) staviti try catch blokove ?

Cilj je zapravo ispisati poruku korisniku da se dogodio neki Exception tipa “Stranica trenutno nije dostupna.” a u pozadini napraviti log u text file da se dogodila greška s bazom i slanje maila administratoru stranice.

Rješio sam na kraju na slijedeći način, iako nisam baš presretan. Stavio sam try { cijeli blok izvršavanja aplikacije } te nakon toga svaki mogući catch. Unutar catcha zapisujem grešku u log i šaljem email administratoru (ukoliko je to potrebno) te zovem die(); s porukom koju vidi krajnji korisnik. Eventualno bi tu mogao pozvati možda neku statičnu 404 not found ili 500 internal server error stranicu.

try {
    // create new router
    $router = $container->get('Router');
    $router->import('Config/routes.php');

    // run the router
    $router->route();

    // load controller
    $dispatcher = $container->get('Dispatcher');
    $dispatcher->load();
} catch (DatabaseException $e) {
    $message = $e->getMessage(). "\r\n"
		. 'Query: ' . $e->getQuery() . "\r\n"
		. 'Stack trace:'  . "\r\n"
		. $e->getTraceAsString();
    $log->critical($e->getTitle(), $message);
    $mail->sendMail("[email protected]", $e->getTitle(), $message);
    die("Database error message to user!");
} catch (FileException $e) {
    $log->log('File error', $e->getMessage());
    die("File error message to user!");
} catch (Exception $e) { // default
    $log->log('Default exception', $e->getMessage());
    die("Some exceptional error message to user!");
}