2011-07-31 9 views
13

Tengo un método de ayuda de Scala que actualmente intenta recuperar una URL y devolver una Opción [String] con el HTML de esa página web.¿Es mejor devolver None o arrojar una excepción al recuperar URL?

Si hay alguna excepción (URL mal formada, tiempos de espera de lectura, etc.) o si hay algún problema, devuelve un Ninguno. La pregunta es, ¿sería mejor lanzar la excepción para que el código de llamada pueda registrar la excepción o sea preferible devolver None en este caso?

+1

Si se trata de un método de ayuda, supongo que es privado. Si es privado, entonces usted es quien llama. Si usted es quien llama, entonces usted es quien tiene toda la información sobre lo que debería suceder, haga lo que quiera. De lo contrario, ver la respuesta de Jean. – agilesteel

Respuesta

32

La creación de excepciones es costosa porque el recorrido de la pila debe llenarse. Lanzar y atrapar excepciones también es más costoso que un retorno normal. Teniendo en cuenta que, tal vez, hágase las siguientes preguntas:

  • ¿Quieres forzar manejo de un error de la persona que llama? Si es así, no haga una excepción, ya que Scala no tiene ningún mecanismo de excepción de verificación que obligue a la persona que llama a atraparlos.

  • En caso de error, ¿desea incluir detalles sobre por qué falló? Si no, puede simplemente devolver Option[A], donde A es su tipo de devolución, y luego tendría Some(validContent) o None, sin explicación adicional. En caso afirmativo, puede devolver algo como Either[E, A] o un Scalaz Validation[E, A]. Todas estas opciones fuerzan a la persona que llama a que de alguna manera desenvuelva el resultado mientras es libre de procesar el error E como lo desee. Ahora, ¿qué debería ser E?

  • ¿Desea proporcionar un seguimiento de pila en caso de error? Si es así, usted podría devolver Either[Exception, A] o Validation[Exception, A]. Si realmente va con la excepción, querrá usar Try[A], cuyos dos casos posibles son Failure(exc: Throwable) y Success(value: A). Tenga en cuenta que, por supuesto, incurrirá en los costos de creación del lanzamiento. Si no, tal vez solo devuelva Either[String, A] (y tenga mucho cuidado de recordar si Right significa éxito o falla aquí - Left se usa generalmente para errores, y Right para el valor "correcto" - Validation es quizás más claro). Si desea opcionalmente devolver un seguimiento de la pila, podría utilizar elevación de Box[A], que podría ser Full(validContents), Empty sin ninguna explicación adicional (muy similar a Option[A] hasta aquí), o indicar una Failure que puede almacenar una cadena de errores y/o un arrojadizo (y más).

  • ¿Es posible que desee proporcionar varias indicaciones de por qué falló? A continuación, devuelva Either[Seq[String], A]. Si lo hace con frecuencia, es probable que desee utilizar Scalaz y un Validation[NonEmptyList[String], A] en su lugar, que proporciona algunos otros buenos extras. Búsquelo para obtener más información al respecto o consulte these usage examples.

+0

¡Gran resumen! Personalmente, utilizo O bien [String, ...] la mayoría de las veces, la Validación de Scalaz parece más clara. –

1

creo que en este caso, si es importante registrar las excepciones a continuación, por todos los medios lanzan las excepciones (y, posiblemente, sólo regresan cadena en lugar de la opción). De lo contrario, también podría devolver el None. Una advertencia: puede haber excepciones por otras razones que no prevén, en cuyo caso puede ser peligroso hacer un código de todo.

Una cosa que podría hacer es algo así como el sistema Lift Box.Una caja es esencialmente una opción, pero con un par de funciones añadidas en: A Full es como Some, Empty es como None, pero Lift va un paso más allá y tiene Failure, que es como Empty pero con una razón/mensaje.

0

La regla general es "si puedes manejar la excepción, manejarla". Entonces no hay suficiente contexto para adivinar. Puede usar el par de métodos tryFetchUrl/fetchUrl.

Cuestiones relacionadas