栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何从外部块重新抛出一个lambda块中的异常?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何从外部块重新抛出一个lambda块中的异常?

如果您想以安全的方式处理已检查的异常,则需要一个辅助方法,该方法提供了将异常包装为的子类型的便利

RuntimeException
。这是一个使用Generic的类型安全性的帮助程序函数,以确保仅声明的异常将被重新抛出(除非您使用不安全的操作):

public static <E extends Throwable> void attempt(    Consumer<Function<E,RuntimeException>> action) throws E {    final class CarryException extends RuntimeException {        final E carried;        CarryException(E cause) { super(cause); carried=cause;        }    }    try { action.accept( CarryException::new ); }    catch(CarryException ex) { throw ex.carried; }}

它支持任意方法

action
,该方法将接收将检查的异常类型临时包装到的函数
RuntimeException
。这种包装将是透明的,该方法
attempt
将正常完成或抛出原始的已检查异常
E
(如果发生,则抛出不相关的未检查异常)。

因此,您可以像这样使用它:

public static void processIterm(Supplier<Key> s)    throws SomeCheckedException  {    attempt( (Function<SomeCheckedException, RuntimeException> thrower) ->        Optional.ofNullable(s).ifPresent(nonNull -> { try { key(nonNull.get()); } // assuming key may throw SomeCheckedException catch(SomeCheckedException  e) { throw thrower.apply(e); }        }));}

由于嵌套操作,编译器无法自动推断异常类型。上面的代码使用

thrower
参数类型的显式声明。或者,您可以使用辅助方法的类型调用,例如

ContainingClass.<SomeCheckedException>attempt( thrower ->    Optional.ofNullable(s).ifPresent(nonNull -> {        try { key(nonNull.get()); }        catch(SomeCheckedException  e) { throw thrower.apply(e); }    }));


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/470264.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号