Tengo una serie de funciones que analizan los datos de los archivos, generalmente devuelven una lista de resultados.Quiero devolver un valor Y presentar una excepción, ¿significa que estoy haciendo algo mal?
Si encuentro una línea dudosa en el archivo, quiero usar Soldier y procesar las líneas válidas, y devolverlas. Pero también quiero informar el error a la función de llamada. La razón por la que deseo informarlo es para que la función de llamada pueda notificar al usuario que el archivo debe ser revisado. No quiero comenzar a hacer cosas de GUI en la función de análisis, ya que parece ser una gran violación de la separación de las preocupaciones. La función de análisis no tiene acceso a la consola a la que estoy escribiendo mensajes de error.
Esto me deja con ganas de devolver los datos exitosos, pero también genera una excepción debido al error, lo que claramente no puedo hacer.
consideran este código:
try:
parseResult = parse(myFile)
except MyErrorClass, e:
HandleErrorsSomehow(str(e))
def parse(file): #file is a list of lines from an actual file
err = False
result = []
for lines in file:
processedLine = Process(line)
if not processedLine:
err = True
else
result.append(processedLine)
return result
if err:
raise MyErrorClass("Something went wrong")
Obviamente las tres últimas líneas no tienen sentido, pero no puedo encontrar una buena manera de hacer esto. Creo que podría hacer return (err, result)
, y lo llaman como
parseErr, parseResult = parse(file)
if parseErr:
HandleErrorsSomehow()
Pero volviendo códigos de error parece bastante ONU-Pythonic, y mucho menos tuplas de códigos de error y los valores de los resultados reales de regresar.
El hecho de que siento que quiero hacer algo tan extraño en una aplicación que no debería ser terriblemente complicada, me hace pensar que probablemente estoy haciendo algo mal. ¿Hay una mejor solución para este problema? ¿O hay alguna forma de que pueda usar finally
para devolver un valor y lanzar una excepción al mismo tiempo?
En este caso, probablemente devolvería una tupla 'processedData, errorInformation', con' errorInformation' siendo una cadena vacía si no se produjo ningún error. Otra opción sería utilizar una función de devolución de llamada, llamada con información de error si ocurre un error: si a la persona que llama no le importa, podría pasar 'None' como devolución de llamada. –