2011-01-27 11 views
23

In PHP, a volte mi cattura alcune eccezioni con try/catch:rilevare un'eccezione senza fare nulla nella cattura

try { 
    ... 
} catch (Exception $e) { 
    // Nothing, this is normal 
} 

Con questo tipo di codice, io alla fine con la variabile $ e che è creato per niente (molte risorse) e PHP_MD (PHP Mess Detector) crea un avviso a causa di una variabile non utilizzata.

C'è un modo per catturare un'eccezione senza dover creare una variabile?

Grazie

+1

Un'eccezione non deve essere considerata "normale": si tratta di un'eccezione o meno. Cosa sta gettando le eccezioni? –

+0

Sto verificando che il modello stia generando un'eccezione quando dovrebbe. Quindi ho un blocco catch vuoto perché voglio solo verificare che l'eccezione sia stata lanciata. –

risposta

6

Questo è il punto centrale di eccezioni - è possibile avere più blocchi catch diversi per catturare tutte le eccezioni che ci si vuole gestire. I dati dell'eccezione devono essere assegnati da qualche parte, quindi la variabile. Potresti fare qualcosa come unset($e) all'interno del blocco catch se davvero non vuoi vedere quegli avvertimenti ... o disabilitare gli avvisi (generalmente una cattiva idea).

6

No.

In ogni caso, è generalmente una cattiva idea per intercettare un'eccezione e non fare nulla; esistono eccezioni proprio per costringerti a gestire le circostanze eccezionali (altrimenti l'esecuzione viene interrotta), quindi è comprensibile che il linguaggio non faciliti un simile caso d'uso.

+3

Allo stesso tempo, è generalmente una cattiva idea lanciare un'eccezione quando probabilmente hai solo bisogno di un codice di stato. Se le eccezioni fossero davvero eccezionali, non vedremmo tanti inutili blocchi try/catch. In particolare, molte utilità di rete generano eccezioni ogni volta che si verifica un problema di rete, che interrompe l'incapsulamento e non aiuta realmente il programmatore. Un problema di rete non dovrebbe essere eccezionale quando si è un'utilità di rete, dovresti essere in grado di gestirlo internamente. –

+0

Beh, questo è principalmente per i test: verifica che l'eccezione sia lanciata ... –

-1

Le eccezioni non vengono utilizzate solo per circostanze eccezionali.

Questo scenario utilizza effettivamente delle eccezioni per assicurarsi che l'utente sia disconnesso. A questo punto della sceneggiatura è molto costosa la risorsa per capire quali dati devono essere eliminati, quindi è più veloce solo sfoltire tutto e prendere le eccezioni.

 try { 
     GDS::$DB->exec('DELETE FROM sessions WHERE session_id = ' . session_id()); 
     GDS::$DB->exec('DELETE FROM sessions WHERE user_id = ' . $this->data['user_id']); 
    } catch(PDOException $ex) {} 
    session_regenerate_id(true); 
    setcookie('bis_[user_id]', 0, time() - 1, null, null, false, true); 
    setcookie('bis_[session_start]', 0, time() - 1, null, null, false, true); 
    setcookie('bis_[session_time]', 0, time() - 1, null, null, false, true); 
+6

Come è questa una risposta? –

+0

Inoltre, salta la seconda frase se i primi tiri, che probabilmente non sono quelli che intendevano. – Artefacto

3

No, ma è possibile disinserirlo.

try { 
    ... 
} catch (Exception $e) { 
    unset($e); 
} 

Suppongo che si stia rilevando solo l'eccezione perché non è necessario perché si desidera. Se si desidera utilizzare try, è necessario utilizzare catch. quindi le opinioni della gente sulla sua cattiva idea di cogliere l'eccezione è irrilevante. Dovrebbero essere fatti degli sforzi per ottenere il risultato richiesto senza usare try/catch. Per quanto ne so non c'è alternativa.

Uso qualcosa del genere per il mio motore di template.

//array of templates ordered by version new to old. 
for($templates as $tpl){ 
    try { 
     $output = render($tpl,$data); 
     //it worked 
     break; 
    } catch(ErrorException $e){ 
     unset($e); 
    } 
} 
if(!empty($output)){ 
    return $output; 
} 
Problemi correlati