Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z wyjątkami
Forum PHP.pl > Forum > PHP
szumigt
Witam exclamation.gif !
Właśnie rozpoczynam pisanie kodu do nowego projektu katalogu internetowego. Projekt nie będzie zbyt wielki. Ma on jedynie służyć prezentacji asortymentu więc zdecydowałem się na zastosowanie Smarty i jakiejś kalsy do obsługi zapytań do MySQL-a (padło na AdoDB). W którymś momencie pisania kodu przyszła pora na obsługę błędów. Skoro mam do dyspozycji na serwerze PHP5 to postanowiłem zastosować wyjątki. I tutaj pojawił się problem. Jak zrobić klasę która będzie na podstawie danego numeru kodu błędu wyświetlać dany szablon .tpl w którym zagnieżdżona będzie odp treść wiadomości. Inaczej mówiąc klasa ta ma mieć narzucone otwieranie góra czterech szablonów (bład zapytania sql, błąd konfiguracji lub bibliotek serwisu, niewłaściwe parametry wchodzące np z GET-a i przerwa konserwacyjna) z których każdy będzie miał przekazywany jakiś tam komunikat. Ale może pokaże najpierw kod jaki do tej pory powstał a potem omówię co jeszcze.

exceptions.php
Kod
class MyException extends Exception
{
     public function __construct($code = 0) {
         parent::__construct('blad blad', $code);
     }

     public function __toString() {
         return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
     }

     public function NewErrorRedirect() {
         //tutaj funckja przekierowująca na nową stronę
     }
}


index.php
Kod
require_once 'page.php';
try {
    $str = new PageControler();
    $str->smarty -> assign("cats",$str->getCategories());
    $str->smarty -> display($str->getView());
}
catch (MyException $e) {
    die($e->NewErrorRedirect());
}


page.php
Kod
require_once 'smarty/Smarty.class.php';
require_once 'adodb/adodb.inc.php';
require_once 'exceptions.php';

class PageControler {
    private $db;
    public $smarty;
    private $settings = array();

    function getSettings() {
       $config = parse_ini_file("config.ini", TRUE);
       return $config;
    }

    function __construct() {
       $this->settings = $this->getSettings();

       $this->settings['view'] = $this->getView();
       $this->settings['id'] = $this->getId();

       $this->smarty = new Smarty();
       $this->smarty->template_dir = $this->settings['smarty']['szablony'];
       $this->smarty->compile_dir = $this->settings['smarty']['kompilacja'];
       $this->smarty->cache_dir = $this->settings['smarty']['bufor'];
       $this->db = ADONewConnection($this->settings['db']['type']);

       if(!$this->db->Connect($this->settings['db']['host'],$this->settings['db']['user'],$this->settings['db']['passwd'], $this->settings['db']['database']))

       throw new MyException (10003);
    }
    
    public function getView() {
        $this->settings['view'] = $_GET['view'];
    }

    public function getId() {
        $this->settings['id'] = $_GET['id'];
    }
}


No i na zakończenie. Problem jest taki żeby klasa PageControler przekazywała jedynie kod błędu do klasy Exception a ta będzie robiła resztę.... Chyba że takie rozwiązanie jest bezsensowne to oczywiście też chętnie posłucham uwag krytycznych :-)
Pozdr.


Nikt nie wie czy wie ale nie powie questionmark.gif :-(

Sorki ale czy to jest jakieś idiotyczne pytanie czy nikt poprostu nie wie questionmark.gif
em1X
stwórz sobie kilka klas wyjątków, każdy będzie inaczej reagował

  1. <?php
  2. class sqlErrorException extends Exception {
  3.  ...
  4. }
  5.  
  6. class confErrorException extends Exception {
  7.  ...
  8. }
  9.  
  10. class parameterErrorException extends Exception {
  11.  ...
  12. }
  13. ?>


potem sobie to możesz wyłapywać:

  1. <?php
  2. try {
  3. $str = new PageControler();
  4. $str->smarty -> assign("cats",$str->getCategories());
  5. $str->smarty -> display($str->getView());
  6. }
  7. catch (sqlErrorException $e) {
  8.  // costam
  9. }
  10. catch (confErrorException $e) {
  11.  // costam
  12. }
  13. catch (parameterErrorException $e) {
  14.  // costam
  15. }
  16. ?>
szumigt
Dzięki. Popróbuję zobaczymy z jakim efektem. :-)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.