Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [PHP5] Exceptions a cascata

    Ciao.
    Vorrei conoscere il Vs parere sull'uso delle
    Exceptions.
    Ho una classe con il seguente metodo che lancia
    un exception:

    Codice PHP:
    public function query($query){
            if(!
    $this->result=$this->mysqli->mysqli->query($query)){
                throw new 
    DbException('Error query : [b]['.$query.'][/b] in class [b]['.__CLASS__.'][/b]');
            }
            if(
    $this->result instanceof mysqli_result){
                return new 
    Result($this->result);
            }
        } 
    in un'altra classe ho questo metodo:

    Codice PHP:
    public function insert($title,$description){
            
    $querysprintf("INSERT INTO categories (category_ID, category_title, category_description) VALUES ('12','%s','%s');",
            
    $this->db->escape($title),$this->db->escape($description));
            
    $this->db->query($query);
            
            
        } 
    naturalmente nella index avrò:

    un blocco try {} catch(DbException $e)

    Adesso volevo spostare la segnalazione dell'errore
    su il metodo insert che quindi diventa:

    Codice PHP:
    public function insert($title,$description){
            try{
                
    $querysprintf("INSERT INTO categories (category_ID, category_title, category_description) VALUES ('12','%s','%s');",
                
    $this->db->escape($title),$this->db->escape($description));
                
    $this->db->query($query);
            }
            catch(
    DbException $e){
                throw new 
    CategoryModelException($e->getMessage().' in class [b]['.__CLASS__.'][/b]');
            }
        } 
    e nella index try{} catch(CategoryModelException $e){
    echo $e;
    exit();
    }

    Che mi dite io sarei per il secondo metodo
    ma (anche se ad ogni query dovrei scrivere il
    doppio di codice )
    aspetto i vs. illustri pareri





    PS.

    Se mi sono spiegato male domandate pure ...........
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  2. #2
    Uppino
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  3. #3
    Nel secondo modo però dovresti perdere lo stack trace della prima eccezione, nel senso che lanciando la CategoryModelException la DbException si perde perchè intercettata dal blocco try del metodo insert.

    Nel caso della insert il problema non ti si dovrebbe porre, in quanto è solo il metodo query che lancia la DbException (escape non penso lanci eccezioni ), non so poi in altri casi. In un codice più complesso potresti perdere la provenienza dell' eccezione DbException.
    Potresti in questo caso specializzare le eccezioni (tipo CategoryModelException) overloadando il costruttore dell' eccezione in modo che gli passi come parametro anche lo stack trace.

    Codice PHP:
    public function insert($title,$description){
            try{
                
    $querysprintf("INSERT INTO categories (category_ID, category_title, category_description) VALUES ('12','%s','%s');",
                
    $this->db->escape($title),$this->db->escape($description));
                
    $this->db->query($query);
            }
            catch(
    DbException $e){
                throw new 
    CategoryModelException($e->getTrace(), $e->getMessage().' in class [b]['.__CLASS__.'][/b]');
            }
        } 
    la classe CategoryModelException
    Codice PHP:
    class CategoryModelException extends Exceptions{
            private 
    $prevTrace;
            public 
    __construct($trace=array(), $message null$code=0){
                    
    $this->prevStrace $trace;
                    
    parent:__construct($message$code);
            }

            public 
    getPrevTrace(){
                    return 
    $this->prevTrace;
            }

    In questo modo (ovviamente puoi riportarti tutti i valori che vuoi nell' eccezione) puoi mantenere traccia dell' eccezione padre.

    Ciao

  4. #4
    Grazie della risposta

    Nel secondo modo però dovresti perdere lo stack trace della prima eccezione, nel senso che lanciando la CategoryModelException la DbException si perde perchè intercettata dal blocco try del metodo insert.
    No, mantengo lo stack trace attraverso $e->getMessage()
    anche se ritengo che fatto 30 .............

    Potresti in questo caso specializzare le eccezioni (tipo CategoryModelException) overloadando il costruttore dell' eccezione in modo che gli passi come parametro anche lo stack trace.
    D'accordissimo una cosa del genere:

    qui

    Praticamente il consiglio che volevo



    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.