Я использую util.control.Exception.catching
для преобразования внутренних исключений в тип исключения, специфичный для моей библиотеки:
import util.control.Exception._
abstract class MyException extends Exception
case class ErrorOccurredDuringFoo(e : Exception) extends MyException
def foo : Foo = {
catching(classOf[Exception]) either { fooInternals } match {
case Left(e) => throw ErrorOccurredDuringFoo(e)
case Right(v) => v
}
}
К сожалению, это не работает. Применение Catch
, возвращенного either
, не возвращает Either[Exception,Foo]
, оно возвращает Either[Throwable,Foo]
. Но я уже сказал catching
Я хочу, чтобы он перехватывал только подтипы Exception
, а не все Throwable
с, а внутри он уже соответствует Exception
.
Я правильно использую это? Разве я не могу убедить catching
вернуть исключение, которое оно ловит, как экземпляр класса исключений, которые я просил его отловить? Моя лучшая ставка - просто добавить лишнюю asInstanceOf[Exception]
? Я предпочел бы, если бы я мог избежать этого, так как экземпляр catching
мог бы быть логически создан в другом месте, и я хотел бы получить ошибку компиляции, если однажды я изменю его на catching[Throwable]
без изменения ErrorOccurredDuringFoo
, а не ошибка времени выполнения при сбое приведения к Exception
.