Supongamos que deseo ajustar el código que puede generar excepciones con un bloque try-catch que registra la excepción y continúa. Algo así como:¿Es posible pasar "esto" como parámetro implícito en Scala?
loggingExceptions {
// something dangerous
}
Idealmente, me gustaría utilizar para registrar el registrador definido en el objeto que llama, en su caso (y en su defecto, obtener un error en tiempo de compilación). Me gustaría definir algo como esto:
def loggingExceptions[L <: { def logger: Logger }](work: => Unit)(implicit objectWithLogger: L): Unit = {
try {
work
} catch {
case t: Exception => objectWithLogger.logger.error(t.getMessage)
}
}
donde objectWithLogger de alguna manera "mágica" para ampliar "este" código en el cliente. ¿Es esto (o algo similar) posible?
+1 para el ejemplo. Esto se puede hacer, pero es desaconsejable. No separa la preocupación de registro, así como un rasgo de Registro, requiere "magia implícita" e incurre en sobrecarga de tiempo de compilación (búsqueda implícita) y tiempo de ejecución (reflexión) innecesarios. La implementación oculta el hecho de que la conversión implícita debe estar dentro del alcance, y en una base de código más realista, esto requeriría una declaración de importación en el código del cliente. –
Su lista de negativos resume a "Prefiero resolver un problema diferente". Bueno, sí, ¿no es así? – extempore
No realmente. El problema fundamental es registrar excepciones en un bloque de código dentro de una clase que tiene un registrador. Puedes resolver ese problema de la forma en que el PO originalmente se imaginó (con implicits), o puedes resolverlo de forma mucho más simple con un rasgo. –