In Python, dovresti assolutamente catturare e rilanciare quell'eccezione, per la sola ragione che un lettore del codice vede immediatamente che potrebbe sorgere durante la normale esecuzione.
Questo dice al lettore che viene restituito il valore corrispondente, ma non hai pensato al comportamento corretto quando la chiave non è stata trovata:
def get(key):
return items[key]
Questo mi dice che ti aspetti di ricevere le chiavi mancanti e che i chiamanti potrebbero ricevere un KeyError. Ci si aspetta che un chiamante prenda questo errore:
def get(key):
try:
return items[key]
except KeyError:
raise
Questo mi dice che la chiave deve essere presente, qualsiasi altra cosa sarebbe un errore di programmazione:
def get(key):
assert key in items
return items[key]
Se crei un messaggio di errore personalizzato, assicurati che questo messaggio contenga tutte le informazioni necessarie per risolvere e comprendere il problema. In particolare, il messaggio di errore dovrebbe contenere la chiave mancante - utilizzare repr()
non str()
per questo.
"item {!r} was not registered".format(key)
Se la formattazione del messaggio di errore è costosa e il messaggio di errore viene letto raramente perché verrà rilevato nella maggior parte dei casi, è possibile creare un'eccezione personalizzata per rinviare la formattazione finché non viene visualizzato l'errore. È comunque possibile ereditare da KeyError in modo che possa essere catturato senza modifiche:
class NotRegisteredError(KeyError):
def __init__(self, key):
super().__init__(key)
self.key = key
def __str__(self):
return "item {!r} was not registered".format(self.key)