La soppressione degli errori è accettabile nel ruolo del meccanismo logico?

5

Questo è emerso nella revisione del codice al lavoro nel contesto di PHP e @ operatore . Tuttavia voglio provare a mantenere questo in forma più generica, dal momento che poche domande su di esso che ho trovato su SO sono impantanate in specifiche tecniche.

L'accesso al campo dell'array, che non è impostato, genera un messaggio di errore e viene comunemente gestito seguendo la logica (pseudo codice):

if field value is set
   output field value

Il codice in questione lo stava facendo come:

start ignoring errors
output field value
stop ignoring errors

Il ragionamento di quest'ultimo è che è il codice più compatto e leggibile in questo caso specifico. Sento che questi benefici non giustificano l'uso improprio (IMO) della meccanica linguistica.

  • Un tale codice è in "cattiva" cattiva gestione?

  • È possibile scartare eventuali errori (per qualsiasi motivo) pratica accettabile per gestirla esplicitamente (anche se ciò porta a un codice più esteso e / o intensivo)?

  • È accettabile per gli operatori di programmazione attraversare i confini dell'uso previsto (come in questo caso utilizzando la gestione degli errori per il controllo dell'output)?

Modifica

Volevo mantenerlo più generico, ma il codice specifico in discussione era simile a questo:

if ( isset($array['field']) ) {
    echo '<li>' . $array['field'] . '</li>';
}

rispetto al seguente esempio:

echo '<li>' . @$array['field'] . '</li>';
    
posta Rarst 17.11.2011 - 22:02
fonte

2 risposte

9

È una pessima abitudine:

  • Il codice è essenzialmente non verificabile: riesco a malapena a capire le persone che non eseguono il test unitario, ma sopprimono del tutto gli errori?
  • Esegue una penalizzazione delle prestazioni, qualcosa che è indirizzato in php5.4 .
  • L'operatore sopprime gli errori critici , che portano all'uscita di script (buona fortuna trovando che nome della funzione errata)

Per le tue domande specifiche:

Is such code is being "clever" in a bad way?

Sì, è un ottimo esempio di " intelligente". Stiamo utilizzando un hook pre-commit PHP_CodeSniffer per rilevare tale "intelligenza".

Is discarding possible error (for any reason) acceptable practice over explicitly handling it (even if that leads to more extensive and/or intensive code)?

C'è un solo scenario accettabile per la soppressione degli errori, e questo è quando la tua intenzione è di catturare l'errore e lanciare un'eccezione. Soprattutto quando si sopprime una terza parte o una funzione non documentata.

Is it acceptable for programming operators to cross boundaries of intended use (like in this case using error handling for controlling output)?

Ho visto la soppressione degli errori usata al posto di isset , come discusso in questo articolo . La penalizzazione delle prestazioni la rende una cattiva pratica.

Aggiornamento: sembra che MikeSchinkel abbia avuto il tempo di verificare se c'è effettivamente un problema di prestazioni quando si utilizza la soppressione degli errori, ed è un abbastanza significativo * :

It is slower, but not in all cases; the case where it exists it can be faster. Where it is slower it can be up to ~5 times slower, but typically more like ~3 times slower

Qualsiasi approccio che sia potenzialmente 5 volte più lento di un altro approccio, senza aggiungere alcun altro valore, è ovviamente contro-intuitivo, per usare un eufemismo.

* Estratto dai commenti. Lo script è estremamente impreciso, poiché tutti i test vengono eseguiti sullo stesso script, ma dà un'idea generale.

    
risposta data 17.11.2011 - 22:49
fonte
6

Non penso che sia accettabile per il codice distribuito alla produzione. Nelle fasi di sviluppo e testing, questo potrebbe essere OK se ci sono errori che ci si aspetta e si desidera evitare per ora , ma la soppressione degli errori alla fine porterà ad errori importanti che vengono soppressi e a quel punto, il debug diventerà molto più difficile perché qualsiasi messaggio di errore che altrimenti ti avvisasse di qualcosa di brutto è stato soppresso e potresti anche non sapere da dove cominciare a cercare.

    
risposta data 17.11.2011 - 22:29
fonte

Leggi altre domande sui tag