È una cattiva pratica seguire una chiamata a una funzione di chiusura con exit ()?

2

Attualmente sto lavorando su un frontend php. In particolare, il processo di autenticazione.

Risparmierò tutti i dettagli esatti dell'albero decisionale, ma include molti controlli e circa la metà di essi si diramano verso una chiamata a do_logon() che genera la pagina di accesso e quindi chiama exit per interrompere l'elaborazione ulteriormente.

Attualmente seguo ciascuna di queste chiamate con un'altra un'altra istruzione exit nel ramo stesso:

if($db->authenticate($user,$password)) {
     ... continue processing checks...
} else {
    $message='Invalid password';
    do_logon($message,true);
    exit;
}

Pur sapendo che l'ultimo exit non verrà mai chiamato perché do_logon termina su exit .

Il mio ragionamento è che mentre I so che do_logon uscirà sempre, altre persone che potrebbero finire di lavorare su questo codice potrebbero non farlo, o se mi viene chiesto di mantenere questo codice a metà Da un decennio a questa parte potrei non ricordare, quindi aggiungere l'istruzione di uscita superflua non altera il flusso del codice, ma chiarisce che l'elaborazione si fermerà qui, ma sto trascurando qualcosa?

    
posta Shadur 03.02.2014 - 12:29
fonte

2 risposte

4

No, non devi exit o die . Puoi avere il do_logon di terminare lo script internamente (cattiva pratica) o consentire che lo script finisca da solo.

Se inserisci questo codice in una funzione, puoi semplicemente tornare dalla funzione. Permette a tutte le chiamate di propagarsi fino al termine dello script.

function auth() {
    if(!$db->authenticate($user,$password)) {
        $message='Invalid password';
        do_logon($message,true);
        return;
    }
    ... continue processing checks...
}

Se il tuo progetto attuale limita questo tipo di comportamento, allora è preferibile lanciare un'eccezione.

    if(!$db->authenticate($user,$password)) {
        $message='Invalid password';
        do_logon($message,true);
        throw new Exception("Unexpected return from do_logon");
    }
    ... continue processing checks...

È possibile rilevare l'eccezione più in alto nella catena di chiamate o consentire al server di fornire una risposta 500.

Perché lanciare un'eccezione?

Qualcosa è andato storto in modo inaspettato all'interno di do_logon . Forse il codice è cambiato o c'è un caso d'uso per cui non hai tenuto conto. In entrambi i casi, la richiesta corrente al server non è più valida. Se qualcosa di più in alto può catturare l'eccezione e gestirla, allora va bene altrimenti ferma la richiesta corrente.

    
risposta data 03.02.2014 - 15:35
fonte
0

La risposta generale alla tua domanda è che dovresti morire () e non uscire.

Stai descrivendo un posto nel tuo codice che non dovrebbe mai essere raggiunto e (indipendentemente da ciò che qualcuno pensa di questo particolare esempio) queste situazioni si presentano. La cosa corretta da fare è implementare una funzione Die () (se non ne hai già uno) e chiamarla ovunque qualcosa "non può accadere". Garantisco che troppo presto uno di questi sarà colpito, indipendentemente da "non può accadere"!

La funzione Die () dovrebbe registrare la chiamata, incluso da dove è stata chiamata, e quindi terminare. Spesso può essere derivato da una funzione Assert (), che verifica che alcune condizioni siano vere e muoiono se non lo sono. Se non hai familiarità con questi concetti o non li stai già utilizzando, potrebbe essere utile un po 'di lettura.

    
risposta data 03.02.2014 - 15:23
fonte

Leggi altre domande sui tag