异常处理:实现JUnit API-java培训班
当java培训班偶然发现JUnit的GitHub上issue编号#706问题(译注:为JUnit增加一个新API),想到了一个新的处理方法:
ExpectedException#expect(Throwable, Callable)
一方面,建议可以像这样创建一个拦截器。
assertEquals(Exception.class, thrown(() -> foo()).getClass());
assertEquals("yikes!", thrown(() -> foo()).getMessage());
另一方面,为什么不像下面这样这样重新?
// This is needed to allow for throwing Throwables
// from lambda expressions
@FunctionalInterface
interface ThrowableRunnable {
void run() throws Throwable;
}
// Assert a Throwable type
static void assertThrows(
Class throwable,
ThrowableRunnable runnable
) {
assertThrows(throwable, runnable, t -> {});
}
// Assert a Throwable type and implement more
// assertions in a consumer
static void assertThrows(
Class throwable,
ThrowableRunnable runnable,
Consumer
) {
boolean fail = false;
try {
runnable.run();
fail = true;
}
catch (Throwable t) {
if (!throwable.isInstance(t))
Assert.fail("Bad exception type");
exceptionConsumer.accept(t);
}
if (fail)
Assert.fail("No exception was thrown");
}
因为大部分功能接口不能抛出Checked异常,所以上面的方法断言:从具体的Runnable-ThrowableRunnable抛出的相应Throwable。
现在我们按照上面想象的JUnit API进行:
assertThrows(Exception.class, () -> { throw new Exception(); });
assertThrows(Exception.class,
() -> { throw new Exception("Message"); },
e -> assertEquals("Message", e.getMessage()));
事实上,甚至我们可以更进一步写出类似下面的帮助方法:
// This essentially swallows exceptions
static void withExceptions(
ThrowableRunnable runnable
) {
withExceptions(runnable, t -> {});
}
// This delegates exception handling to a consumer
static void withExceptions(
ThrowableRunnable runnable,
Consumer
) {
try {
runnable.run();
}
catch (Throwable t) {
exceptionConsumer.accept(t);
}
}
这样处理各种异常非常有用。下面是两种常用方法:
try {
// This will fail
assertThrows(SQLException.class, () -> { throw new Exception(); });
}
catch (Throwable t) {
t.printStackTrace();
}
withExceptions(
// This will fail
() -> assertThrows(SQLException.class, () -> { throw new Exception();}),
t -> t.printStackTrace()
);
由于这些方法对很多异常类型和try-with-resources支持不够好,不见得比常用的try..catch..finally语句块有用。
但是这样的方法以后会在日常中用到。
【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!
Java开发高端课程免费试学
大咖讲师+项目实战全面提升你的职场竞争力
- 海量实战教程
- 1V1答疑解惑
- 行业动态分析
- 大神学习路径图
相关推荐
更多达内就业喜报
更多>Java开班时间
-
北京 丨 11月27日
火速抢座 -
上海 丨 11月27日
火速抢座 -
广州 丨 11月27日
火速抢座 -
兰州 丨 11月27日
火速抢座 -
杭州 丨 11月27日
火速抢座 -
南京 丨 11月27日
火速抢座 -
沈阳 丨 11月27日
火速抢座 -
大连 丨 11月27日
火速抢座 -
长春 丨 11月27日
火速抢座 -
哈尔滨 丨 11月27日
火速抢座 -
济南 丨 11月27日
火速抢座 -
青岛 丨 11月27日
火速抢座 -
烟台 丨 11月27日
火速抢座 -
西安 丨 11月27日
火速抢座 -
天津 丨 11月27日
火速抢座 -
石家庄 丨 11月27日
火速抢座 -
保定 丨 11月27日
火速抢座 -
郑州 丨 11月27日
火速抢座 -
合肥 丨 11月27日
火速抢座 -
太原 丨 11月27日
火速抢座 -
苏州 丨 11月27日
火速抢座 -
武汉 丨 11月27日
火速抢座 -
成都 丨 11月27日
火速抢座 -
重庆 丨 11月27日
火速抢座 -
厦门 丨 11月27日
火速抢座 -
福州 丨 11月27日
火速抢座 -
珠海 丨 11月27日
火速抢座 -
南宁 丨 11月27日
火速抢座 -
东莞 丨 11月27日
火速抢座 -
贵阳 丨 11月27日
火速抢座 -
昆明 丨 11月27日
火速抢座 -
洛阳 丨 11月27日
火速抢座 -
临沂 丨 11月27日
火速抢座 -
潍坊 丨 11月27日
火速抢座 -
运城 丨 11月27日
火速抢座 -
呼和浩特丨11月27日
火速抢座 -
长沙 丨 11月27日
火速抢座 -
南昌 丨 11月27日
火速抢座 -
宁波 丨 11月27日
火速抢座 -
深圳 丨 11月27日
火速抢座 -
大庆 丨 11月27日
火速抢座