Por lo general, prefiero manejar las excepciones internamente (es decir, intentar / excepto dentro de la función llamada, posiblemente devolviendo None) porque Python se escribe dinámicamente. En general, lo considero un juicio de una forma u otra, pero en un lenguaje escrito dinámicamente, hay pequeños factores que inclinan la balanza a favor de no pasar la excepción a la persona que llama:
- Cualquiera que llame a su función no es notificado de las excepciones que se pueden lanzar. Se convierte en una especie de forma de arte saber qué tipo de excepción está buscando (y los bloques de excepción genérica deben evitarse).
if val is None
es un poco más fácil que except ComplicatedCustomExceptionThatHadToBeImportedFromSomeNameSpace
. En serio, odio tener que recordar escribir from django.core.exceptions import ObjectDoesNotExist
en la parte superior de todos mis archivos de django solo para manejar un caso de uso realmente común. En un mundo de tipos estáticos, deje que el editor lo haga por usted.
Honestamente, sin embargo, siempre es una decisión de criterio, y la situación que está describiendo, donde la función llamada recibe un error que no puede ayudar, es una excelente razón para volver a generar una excepción que sea significativa. Tiene la idea exacta correcta, pero a menos que sea una excepción, proporcionará información más significativa en un seguimiento de pila que
AttributeError: 'NoneType' object has no attribute 'foo'
que, nueve de cada diez veces, es lo que verá la persona que llama si devuelve un Ninguno sin controlar, no se moleste.
(Todo esto me hace desear que las excepciones de Python tuvieran los cause
atributos por defecto, como en Java, lo que le permite pasar excepciones a nuevas excepciones para que pueda volver a lanzar todo lo que quiera y nunca perder la fuente original del problema).