2012-01-28 10 views
5

Sono nuovo di php e sono un po 'confuso dal fatto che non sembra esserci alcun errore di comunicazione dell'oggetto da un metodo al suo chiamante.Gli oggetti di errore restituiti nella cattiva abitudine di PHP?

Questi due sono i modi imparo a utilizzare:

  1. Se un metodo non dovrebbe informazioni al chiamante dell'errore solo attiva un errore se questo non è E_USER_ERROR solo può restituire FALSE da raccontare il chiamante qualcosa è andato storto.

  2. In caso contrario, se un metodo deve restituire alcune informazioni di errore al chiamante, deve essere sollevata un'eccezione.

Provenendo da COCOA ho imparato a utilizzare le eccezioni in condizioni straordinarie (errori non recuperabili a causa di errori del programmatore). In ogni altro caso basta passare un oggetto errore al chiamante.

  • La filosofia è diversa in PHP?
  • Sono eccezioni il meccanismo standard per inviare dati di errore al chiamante?
  • Devo evitare di programmare i miei oggetti di errore e passare quindi come parametro esterno al metodo per essere coerente con i pattern PHP?
+2

Ho intenzione di girare questo intorno e chiedere "Quando è preferibile restituire un oggetto di errore anziché sollevare un'eccezione?". –

risposta

8

PHP ha due meccanismi principali per indicare e gestione degli errori nel flusso del programma:

Quale scegliere dipende dalle preferenze personali. Le eccezioni sono oggetti, quindi se vuoi fare OOP o provenire da un'altra lingua che usa anche le eccezioni, potresti volerne utilizzare. La gestione degli errori basata su Non-Exception è per tutte quelle Avvisi, Avvertenze ed Errori che PHP può emettere, così come le proprie varianti. Se vuoi trasformarli in Eccezioni, dai un'occhiata a ErrorException.

Tuttavia, come hai già detto: le eccezioni sono per situazioni non recuperabili. Sono non per la gestione del flusso di controllo regolare. Di conseguenza, le eccezioni non sono una sorta di meccanismo standard per inviare messaggi di errore a un chiamante, ad es. non dovresti fare:

class FooValidator 
{ 
    public function isValid($valueToValidate) 
    { 
     if ($this->satisfiesRules($valueToValidate) { 
      return true; 
     } 
     throw new ValidationException('Foo didnt satisfy rule Bar'); 
    } 
} 

e provano a prenderlo nel chiamante. Una convalida fallita è una situazione recuperabile.

Una possibilità potrebbe essere quella di introdurre un Notification Object:

class FooValidator 
{ 
    public function isValid($valueToValidate, Notification $notification) 
    { 
     if ($this->satisfiesRules($valueToValidate) { 
      return true; 
     } 
     $notification->addMessage('Foo didnt satisfy rule Bar'); 
     return false; 
    } 
} 

Nell'esempio precedente, il validatore restituisce solo un valore booleano, ma può raccogliere ulteriori informazioni sul motivo per cui la convalida non è riuscita nell'oggetto notifica passato.Questo è molto più pulito rispetto alla restituzione di un oggetto di errore dalla chiamata, perché non dobbiamo controllare il tipo di reso. Se la convalida restituisce false, sappiamo che possiamo controllare l'oggetto di notifica. Poiché gli oggetti vengono passati per riferimento, non è necessario restituire l'oggetto dalla chiamata, ma semplicemente accedere ai messaggi raccolti dal chiamante.

+0

Mi piace questa risposta, ma non sono stato convinto dall'argomento che non si dovrebbero usare eccezioni per il controllo del flusso. Perchè no? La propagazione delle eccezioni non consente a una funzione esterna a un certo livello di recuperare da un errore nel modo più appropriato? Possiamo quasi sempre "recuperare" da qualcosa che non ci aspettavamo restituendo un valore predefinito, ma la logica di valutare se il valore restituito sia o meno il risultato di una chiamata valida o meno viene lasciato al chiamante. Un'eccezione indica chiaramente che qualcosa non va e si propaga al gestore più appropriato. Per favore, istruiscimi –

+1

@ me232 Un'eccezione indica che si è verificato qualcosa di eccezionale (non solo qualcosa di sbagliato). Una validazione fallita (come nell'esempio sopra) non è eccezionale. Non vi è alcuna ragione per eseguire questo attraverso il processo di gestione delle eccezioni. Vedi anche http://www.c2.com/cgi/wiki?DontUseExceptionsForFlowControl e http://schlitt.info/opensource/blog/0724_python_good_bad_evil_03_flow_control_exceptions.html – Gordon

+0

Sono d'accordo nel tuo esempio l'uso dell'eccezione è abbastanza inutile, dal momento che un ritorno il valore di false è comunque adeguato. La funzione sembra essere in grado di recuperare dal problema stesso. Supponiamo di avere un esempio più complicato di conversione di un oggetto in un altro. È sbagliato lanciare un'eccezione se l'argomento non è adatto alla conversione? Tutti i potenziali chiamanti dovrebbero implementare una logica di validazione? –

0

quasi tutto è possibile in PHP, quindi non c'è davvero un modo migliore.

un'occhiata ad eccezioni su php.net http://php.net/manual/en/language.exceptions.php

+5

Ho dolorosamente imparato che per ogni lingua quasi tutto è possibile, ecco perché i pattern di design ci rendono la vita più facile, evitando di reinventare la ruota e imparare dagli altri. I documenti ufficiali non parlano mai di oggetti di errore, ecco perché lo chiedo. –

Problemi correlati