Sto programmando un'app Web utilizzando Perl e Dancer. La logica non è banale e voglio separare la logica della pagina web (all'interno dei percorsi di Dancer) dalla logica di business che legge e scrive dal database. La logica aziendale verrà memorizzata in diversi moduli, letti e scritti nel database utilizzando DBIx :: Class.
La mia domanda è: qual è il modo migliore per mantenere la logica DB nei moduli di business logic, ma essere ancora in grado di inviare messaggi che spiegano l'errore in una pagina Web e memorizzare più dettagli dell'errore in un log. Mi piacerebbe una tecnica che funzioni con funzioni annidate.
Ci stavo pensando, ma non ho trovato un chiaro vincitore. Le opzioni possibili potrebbero essere:
-
Rileva tutte le eccezioni all'interno della funzione e restituisce l'array ref con i dati. Se si verifica un errore, il risultato sarebbe undef.
-
Rileva tutte le eccezioni all'interno della funzione e restituisce un riferimento hash. Se non si è verificato un errore, il tasto "ok" sarà uguale a 1. Un dato di ritorno sarebbe simile a questo:
return ({ ok => 1, data => [ { name => 'Alfa', year => 2014, }, { name => 'Beta', year => 2015, }, ], });
-
In un caso di errore il valore restituito potrebbe essere qualcosa del tipo:
return ({ ok => 0, err => 'bussines.deliveries.estimated_date.no_access_dhl', err_web => 'No access to DHL site', });
-
-
Cattura le eccezioni nel codice Web utilizzando Try :: Tiny;
Modifica 1 : espansione della mia domanda come risposta a Umut Kahramankaptan : Sto solo iniziando con le eccezioni. Nei giorni scorsi ho letto diverse pagine web sulle aspettative in perl e su come gestirle. Cosa dovrebbe innescare un'eccezione? Un'eccezione è causata solo da un errore (non è possibile aprire un file, una divisione da 0 o un database che non risponde) o dovrebbe essere attivato da un'altra causa che blocca l'esecuzione di una funzione?
Per spiegare l'ultima domanda, propongo diversi casi:
-
Una funzione esegue diverse operazioni di lettura e scrittura su un database. Se uno di questi fallisce dovrebbe attivare un'eccezione.
-
Come per la precedente, una funzione deve eseguire diverse operazioni di lettura e scrittura con un database. Se trova che non può continuare la sua sequenza (a causa di qualche logica o valore esistente nel database), dovrebbe in questo caso attivare l'eccezione?
-
Un esempio più semplice potrebbe essere una funzione di accesso. Se il nome utente e la password sono corretti, dovrebbe restituire diversi dati utente. Cosa dovrebbe succedere se fallisce? return undef ? o attivare un'eccezione?