code: public final Try<T, A> catching(Function<? super T, ? extends Boolean> predicate,
                                      Function<? super T, ? extends A> recoveryFn) {
          return match(t -> predicate.apply(t) ? success(recoveryFn.apply(t)) : failure(t), Try::success);
      }
docs: Catch any thrown <code>T</code> satisfying <code>predicate</code> and map it to a success value.
  
  @param predicate  the predicate
  @param recoveryFn the function mapping the {@link Throwable} to the result
  @return a new {@link Try} instance around either the original successful result or the mapped result