Oltre al tipo, in genere puoi specificare una descrizione testuale. Ad esempio, in un metodo SetPercentage(value)
un errore OutOfRangeError
generato quando il valore è inferiore a zero, ma anche superiore a cento.
Stesso tipo: due errori diversi.
Il testo dell'errore può quindi specificare cosa è andato storto nello specifico. Ad esempio:
if (value < 0) {
raise OutOfRangeError("The value should not be inferior to 0.");
}
if (value > 100) {
raise OutOfRangeError("The value should not be superior to 100.");
}
Descrizione utilizzata esclusivamente per il debug
Questo è ciò che è comunemente usato in linguaggi come Java o C # che usano eccezioni piuttosto che errori . In quelle eccezioni, la descrizione è intesa per essere letta da uno sviluppatore che mantiene (e esegue il debug) l'applicazione; non è previsto che venga mostrato all'utente finale o da utilizzare a livello di programmazione. Non è così utile essere in grado di determinare a livello programmatico quale delle due eccezioni si è verificata (facendo un switch
sulla descrizione testuale è ovviamente una pessima idea).
Guarda l'immagine più grande. Immagina che il codice sopra sia nel nostro livello aziendale. Quindi, nel livello di presentazione, abbiamo:
try:
int percentage = conversions.parseInt(field.value);
if (percentage < 0) {
field.highlightInRed();
// The percentage should be superior to zero.
form.showError("Le pourcentage doit être supérieur à zéro.");
}
else if (percentage > 100) {
field.highlightInRed();
// The percentage should be inferior to one hundred.
form.showError("Le pourcentage doit être inférieur à cent.");
}
// Call to the business layer happens here.
rebate.changeValue(precentage);
catch ConversionError:
field.highlightInRed();
// The percentage should be an integer number.
form.showError("Le pourcentage doit être un nombre entier.");
Qui non aspettiamo che il livello aziendale generi un'eccezione : un'eccezione dovrebbe rimanere eccezionale, mentre gli utenti digitano "13" quando richiesto per inserire una cifra o gli utenti che scrivono "250" quando viene richiesto di inserire un numero compreso tra 0 e 100 non sono eccezionali.
I progettisti di interazione possono persino decidere che la convalida dell'input possa avvenire su ogni tratto chiave. Digitate 3 e 8 , lo sfondo del campo rimane bianco. Digitate un ulteriore 0 - lo sfondo del campo diventa rosso e appare un suggerimento, mostrando che 380 non è un valore valido per questo campo. Non chiederebbe al livello aziendale di generare eccezioni a ogni tratto di chiave, vero?
È solo se non riesco, come sviluppatore, a fornire controlli corretti a livello di presentazione, rispetto a OutOfRangeError
nel livello aziendale. Questo probabilmente causerebbe un crash e una segnalazione di bug contenente la traccia dello stack: un debug di persone che troverà e risolverà l'errore nel livello di presentazione.
Se si nota una sorta di duplicazione logica tra il livello aziendale e il livello di presentazione nell'esempio precedente, il refactoring può aiutare:
-
Nel livello aziendale, value
era un numero intero. Cosa succede se creo un tipo Percentage
ereditato da una classe appena creata IntInRange
:
abstract class IntInRange
{
private int value;
public abstract readonly IntInRange Min;
public abstract readonly IntInRange Max;
public void SetValue(int value)
{
// Raise OutOfRangeErrors here.
this.value = value;
}
...
}
class Percentage : IntInRange
{
public readonly Percentage Min = 0;
public readonly Percentage Max = 100;
}
-
Nel livello di presentazione, posso quindi utilizzare l'associazione dati per indicare che un determinato campo è associato alla variabile rebate.percentage
di tipo Percentage
. Se il framework di associazione dei dati è intelligente, posso collegare la gestione degli errori con le regole descritte in IntInRange
type e il framework gestirà tutti gli errori stessi. Se è davvero intelligente, genererà il testo degli errori umanamente leggibile, come "La percentuale dovrebbe essere superiore a 0.", la parola "percentuale" corrispondente al nome della variabile.
Si noti che qui, il testo dell'eccezione non è ancora né usato a livello di programmazione, né mostrato all'utente finale. Il framework di associazione dei dati calcola le informazioni dalla classe stessa e il OutOfRangeError
non dovrebbe mai essere colpito (o potrebbe indicare un bug nel framework o nel codice che utilizza questo framework).
Codice utilizzato per le API
Un altro uso che è corretto per gli errori, e non per le eccezioni, consiste nell'incorporare un codice nell'errore. Questo codice viene quindi utilizzato non solo durante il debug, ma anche da sviluppatori di terze parti che accedono a un'API.
Ad esempio, un'API astratta può restituire Error 500371
, che sembra indicare che il valore percentuale è inferiore a zero o Error 500373
, il che significa che il valore percentuale è superiore a cento.
Mentre molte API usano codici di errore criptici (spesso numeri), questo non è sempre il caso. Soprattutto i servizi REST utilizzano sempre più identificatori di testo di un errore:
{
"error": {
"id": "percentage-superior-to-100",
"uri": "http://example.com/errors/percentage-superior-to-100",
"description": "The specified value of the percentage is out of range. The value should be superior or equal to 0 and inferior or equal to 100."
}
}
Qui, mentre description
può cambiare (e può essere localizzato), il id
è garantito per rimanere lo stesso per sempre (fino a quando l'API è obsoleto) e può essere usato a livello di programmazione.