Newsgroup: it.comp.www.php
Titolo: try/catch non funzionante

Forse non mi è chiaro il funzionamento delle exception
ma la situazione è questa:
ad inizio file richiamo una metodo di nome:
$Request = Request::instance();
$Request->execute();
l'execute, include un totale di cose ed anche di più.
In mezzo al totale di cose incluse, un oggetto genera
una exception ErrorException.
Non riesco in nessun modo ad intercettarla con un
try/catch.
Ho provato a mettere:
try {
    $Request->execute();
} catch ( Exception $e ) {
    echo "MORTO";
}
che dovrebbe intercettare tutte le exception che si verificano
da "execute" in giù, tra cui l'exception di cui sopra.
Non viene intercettata.
Ho provato quindi a mettere un blocco try/catch direttamente
dove richiamo il metodo che va in errore, e non viene intercettato
nemmeno li.
Come diavolo funzionano le exception? Non mi è mai capitato non
riuscire ad interceterrne una.
-- 
Non tocca a noi dominare tutte le maree del mondo,
il nostro compito è di fare il possibile per la
salvezza degli anni nei quali viviamo,
sradicando il male dai campi che conosciamo.

 riuscire ad interceterrne una.
A me questo funziona:
class Foo{
    public function bar(){
        throw new Exception();
    }
}
try{
    $a = new Foo();
    $a->bar();
}catch(Exception $e){
    var_dump($e);
    die("MORTO");
}
Credo sia un problema di sintassi.. come la lanci l'exception?
Usi il throw?
Sicuro che il pezzo dove la lanci sia eseguito (prova a metterci un
die("VIVO..per ora"))

 die("VIVO..per ora"))
Non ho idea ne di come venga lanciata, ne di dove sia il punto.
La lancia Kohana, in questo caso, quando non trova il Model perchè
è sbagliato il nome del file.
Kohana di default carica una pagina HTML di errore, devo intercettare
l'exception (a monte di tutto, in modo da intercettarle tutte) e far
caricare una mia pagina xml.
Sono riuscito ad intercettarle, ma a quanto pare non tutte, questa
exception passa come se niente fosse, eppure il try/catch è uguale
per tutti.
Se faccio
try { <codice che muore> }
catch ( Exception $e ) {
   echo "bastardo!"
   die('muori');
}
non mi fa ne l'echo ne il die, come se non ci fosse alcuna exception
generata. Eppure c'è, perchè a video vedo:
ErrorException: Model asdasdas not found.
Stando al forum di Kohana, il bypass delle loro pagine di errore si
fa così, ed è vero, come ho scritto sopra, riesco ad intercettare le
exception, ma a quanto pare non tutte.

 ErrorException: Model asdasdas not found.
Se vedi solo questo senza il traceback, significa che e` Kohana stesso a 
intercettare l'eccezione e a gestirla, e ti mostra solo il Message.
Devi capire dove e eventualmente come disabilitare la gestione.
Bye.

 Devi capire dove e eventualmente come disabilitare la gestione.
So già come disattivarne la gestione, ovvero:
/**
  * Esegue la richiesta
  */
$Request = Request::instance();
try {
     $Request->execute();
} catch ( Exception $e ) {
     if ( get_class($e) == 'RESTException' ) {
         $Request->status            = $e->getCode();
         $Request->response          = View::factory('RESTError');
         $Request->response->code    = $Request->status;
         $Request->response->message = $e->getMessage();
     } else {
         throw $e;
     }
}
$Request>send_headers()->response;
echo $Request->response;
In origine era:
Request::instance()->execute()->send_headers()->response;
Sul forum di Kohana c'è scritto di intercettare le exception in
"execute" perchè son li dentro che si generano.
Ed è vero, con il codice di cui sopra, le riesco ad intercettare.
Tant'è che nel mio programma ho exteso la Exception standard chiamandola
RESTException e riesco a generare degli status code HTTP (ci pensa il
codice scritto sopra a farlo) e caricare una mia view al posto di quella
standard di kohana. (nel caso l'exception fosse generata dal mio software)
Funziona, ma non con tutto, alcune exception non vengono proprio
rilevate dal try/catch.
Il che mi può stare anche bene, le exception a livello Kohana sono
rare, si generano ad esempio quando sbagli a mettere il nome di un
model e così via, ed una volta terminato il progetto, difficile che
si generi una exception di nascosto. Mi va bene avere l'output
tradizionale e gestire con la mia view solo le mie exception (come da
codice), il problema è che non vedo nemmeno l'output di kohana.
Mi arriva un 500 Internal Server Error (lo spara fuori kohana in caso
di exception) ma non vedo il contenuto dell'errore a video e pensavo
fosse il mio try/catch a dar problemi, che filtra troppe cose e carica
la mia view senza contenuto, ma non è così, li dentro non ci passa
proprio, il catch non viene invocato e tantomeno il mio if.


 proprio, il catch non viene invocato e tantomeno il mio if.
Si dai, ok, sono un coglione.
Non vi dirò mai, nemmeno sotto tortura, perchè non vedevo l'output
del messaggio di errore di kohana.
