por lo general prefieren manejar excepciones internamente (es decir try/excepto dentro de la función llamada, posiblemente el retorno de una Ninguno) porque pitón se escribe de forma dinámica. En general, considero que es una cuestión de criterio de una manera u otra, pero en un lenguaje de tipos dinámicos, hay pequeños factores que inclinan la balanza a favor de no aprobar la excepción a la persona que llama: llamar
- nadie su función no se notifica de las excepciones que se pueden lanzar. Se convierte en una especie de forma artística saber qué tipo de excepción estás buscando (y se deben evitar los bloques genéricos excepto).
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 django solo para manejar un caso de uso muy común. En un mundo estáticamente estátizado, deje que el editor lo haga por usted.
Honestamente, sin embargo, siempre es una decisión, 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 plantear una excepción que es significativa . Usted tiene la idea exacta por la derecha, pero a menos que seas una excepción va a proporcionar información más significativa en un seguimiento de la pila de
AttributeError: 'NoneType' object has no attribute 'foo'
cuales, nueve de cada diez veces, es lo que la persona que llama si usted devuelve un no manejado Ninguno, no te molestes.
(Todo esto me hace desear que las excepciones de Python tengan los atributos cause
de forma predeterminada, como en java, que le permite pasar excepciones a nuevas excepciones para que pueda volver a lanzar todo lo que desee y nunca perder la fuente original problema.)
similares: http://stackoverflow.com/questions/1152541/is-it-better-to-use-exception-or-return-code-in-python – codeape
me inclino por lanzar una excepción por lo que me veo obligado a manejar la excepción en la función de llamada. Si olvido comprobar si el resultado es Ninguno en la función de llamada, podría tener un error latente. Si devolvió None, con suerte, la siguiente línea de la función de llamada generará un AttributeError. Sin embargo, si el valor devuelto se agrega a un diccionario y luego se invocan 100 funciones en un archivo fuente diferente, se genera un AttributeError, se divertirá buscando por qué ese valor fue None. – IceArdor
En general, también evito los valores que tienen un significado especial o que tienen varias firmas para una función (podría devolver una cadena o None). – IceArdor