context(raise: Raise) inline fun catchingWhen(toError: (Throwable) -> E?, block: () -> A): A = catch(block) { e -> raise.raise(toError(e) ?: throw e) } // use val id = catchingWhen({ e -> when (e) { is SQLIntegrityConstraintViolationException -> DuplicateUser(email) is SQLTimeoutException -> StoreUnavailable else -> null // unexpected: stays an exception } }) { insertUser(email) }