È accettabile inoltrare un errore software a HTTP 500?

0

Dovrebbe essere generato un errore 500 solo dal server web, o è accettabile che il tuo programma lanci uno solo?

try {
  some bad code;
}
catch (Exception) {
  set_header_code(500);
  set_content_type('application/json');
  set_response_body(json_encode({'is_error': true, 'message': 'An unknown error occurred', 'request_id': $random_number}));
}

Si tratta di un anti-pattern?

Modifica

In risposta ai commenti di Robert Harvey:

500 Internal Server Error -- The server encountered an unexpected condition which prevented it from fulfilling the request.

Wikipedia -- A generic error message, given when no more specific message is suitable. The general catch-all error when the server-side throws an exception.

Potrei usare questo modello per convalidare un modulo:

if ($email_address === null || !is_valid_email($email_address)) {
  throw new Exception('You must supply a valid email address');
}

Il server ha riscontrato una condizione imprevista che impedisce a di soddisfare la richiesta , ovvero che il campo email è mancante o non valido.

Il codice può quindi rilevare questo errore in seguito, convertendolo in una bella pagina di errore 500 con alcuni dati JSON che duplicano l'errore.

Perché dovresti avere sia l'errore 500 che {is_error: true} ? Che ne dici se generi un errore 500 e dici {is_error: false} ? Cosa significa? Perché non lasciarlo come 200 OK con {is_error: true} ?

In JavaScript:

if (http_response_code == 500) {
  // The server did not respond as expected
  // Do not try to parse the response body as JSON
  //   because there's no guarantee it contains JSON data
  // Display default error message
}
else if (http_response_code == 200) {
  response = parse_response_as_json();
  if (response.is_error) {
    display_error_message(response.message);
  }
  else {
    // process response
  }
}
    
posta CJ Dennis 30.11.2016 - 00:39
fonte

2 risposte

4

Per errori di convalida del modulo, un 400 - Bad Request è probabilmente più semanticamente corretto.

Da RFC 7231 :

6.5.1.  400 Bad Request

   The 400 (Bad Request) status code indicates that the server cannot or
   will not process the request due to something that is perceived to be
   a client error (e.g., malformed request syntax, invalid request
   message framing, or deceptive request routing).

500 - Internal Server Error è generalmente usato quando (e normalmente interpretato dai client come) "È successo qualcosa di brutto sul server, non so cosa sia (ma anche se l'avessi fatto, probabilmente non saprei dire tu), e mi sto arrendendo. Mi dispiace, non ha funzionato. "

Ovviamente, nulla ti impedisce di restituire 200 OK , di pubblicare uno stato di errore nel tuo JSON e di consentire al client di risolverlo.

La chiave qui è che un indirizzo email errato non è una condizione eccezionale. È semplicemente un errore di input.

Detto questo, il codice di risposta restituito dal server web è un dettaglio dell'implementazione . L'unico codice che dovrebbe essere a conoscenza di ciò è il codice del server web stesso, e possibilmente qualsiasi codice che scrivi che interagisce direttamente con il server web. Il resto del codice non dovrebbe mai preoccuparsi di questo.

    
risposta data 01.12.2016 - 00:53
fonte
2

Utilizzo della definizione ristretta da articolo di Wikipedia sui server web :

The term can refer to the entire system, or specifically to the software that accepts and supervises the HTTP requests.

(sottolineatura mia), significa che il software che il server Web chiama fuori di sé non deve inviare deliberatamente l'errore 500 o qualsiasi altro errore nell'intervallo 500.

Ecco una descrizione dei gruppi di codici di risposta in un linguaggio semplice:

  • 2XX: Il programma dice: ho seguito le tue istruzioni nel miglior modo possibile e qui trovi la tua risposta, oppure un rapporto sul motivo per cui non ho potuto fare esattamente quello che hai chiesto
  • 3XX: Programma o server dice: so cosa stai chiedendo, ma invece di darlo a te, ti dirò un modo diverso di ottenere la risposta
  • 4XX: Programma o server dice: non posso darti quello che stai cercando
  • 4XX: Server dice: non so cosa stai chiedendo. La tua richiesta è stata ridotta in qualche modo
  • 5XX: Server dice: Uh oh! Qualcosa di veramente importante è andato storto. Mi dispiace davvero di non poter essere più specifico di quello

Dato che non sai quanto sia severo o tollerante ogni client, DEVI usare la definizione stretta e lasciare che il server web invii la maggior parte degli errori. Per definizione, un programma non può inviare un errore 500 (indicando che non è in uno stato funzionante) perché deve essere in uno stato funzionante per farlo.

Il server è in diversi livelli e non è appropriato per tutti inviare un codice di risposta:

  • Hardware del server
  • Sistema operativo (come Linux)
  • Server Web (come Apache) - imposta un codice di risposta per ogni richiesta
  • Linguaggio di programmazione (come PHP) - provoca un errore 500 se il codice si blocca o ha un'eccezione non gestita
  • Codice sito web: può sostituire il codice di risposta predefinito se le regole sono troppo complesse per il server, ad es. errore 404, reindirizzamento 302, ecc.

Ad esempio, se le tue pagine non hanno una locazione fisica ma sono generate dinamicamente, il server non sa se può servirlo con un 200, o non esiste e dovrebbe inviare un 404. Lì non è altra opzione se non quella di sovrascrivere il codice dal tuo programma. Tuttavia, è una cattiva pratica inviare un 500, perché il tuo programma non è andato in crash a quel punto. Mentre il tuo programma è in esecuzione, hai sempre delle opzioni.

È particolarmente negativo inviare due errori che significano la stessa cosa in cui infrangi il principio ASCIUTTO (non ripetere te stesso). Il tuo programma ha determinato che la richiesta era buona, ma i dati erano cattivi (o qualche altro errore). Dovrebbe uscire normalmente, con un codice di 200, e una spiegazione nella risposta di ciò che l'errore era, e ciò che il client o l'utente dovrebbe fare.

TL; DR :

Errore 500: grande incidente. Non usare per piccole cose!

    
risposta data 03.12.2016 - 08:31
fonte

Leggi altre domande sui tag