From c4e8e3d61bc8bc65bfed394fae7c3e41f03a6986 Mon Sep 17 00:00:00 2001 From: Thomas Bruyelle Date: Thu, 25 Jul 2013 23:33:43 +0200 Subject: [PATCH] Propagate exceptions on @Background/@UIThread annotated methods The main goal of this fix is to avoid hiding exception to ExceptionHandler. --- .../helper/APTCodeModelHelper.java | 7 ++++-- .../processing/BackgroundProcessor.java | 2 +- .../test15/ThreadActivityTest.java | 22 +++++++++++++++++++ .../test15/ThreadActivity.java | 10 +++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java index 4153fec49a..e4ae3aa779 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java @@ -228,7 +228,7 @@ public String getIdStringFromIdFieldRef(JFieldRef idRef) { throw new IllegalStateException("Unable to extract target name from JFieldRef"); } - public JTryBlock surroundWithTryCatch(EBeanHolder holder, JBlock block, JBlock content, String exceptionMessage) { + public JTryBlock surroundWithTryCatch(EBeanHolder holder, JBlock block, JBlock content, String exceptionMessage, boolean propagate) { Classes classes = holder.classes(); JTryBlock tryBlock = block._try(); tryBlock.body().add(content); @@ -239,6 +239,9 @@ public JTryBlock surroundWithTryCatch(EBeanHolder holder, JBlock block, JBlock c errorInvoke.arg(exceptionMessage); errorInvoke.arg(exceptionParam); catchBlock.body().add(errorInvoke); + if (propagate) { + catchBlock.body()._throw(exceptionParam); + } return tryBlock; } @@ -257,7 +260,7 @@ public JDefinedClass createDelegatingAnonymousRunnableClass(EBeanHolder holder, JBlock runMethodBody = runMethod.body(); - surroundWithTryCatch(holder, runMethodBody, previousMethodBody, "A runtime exception was thrown while executing code in a runnable"); + surroundWithTryCatch(holder, runMethodBody, previousMethodBody, "A runtime exception was thrown while executing code in a runnable", true); return anonymousRunnableClass; } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java index 896839e428..53f746fcdb 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java @@ -61,7 +61,7 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) t executeMethod.annotate(Override.class); JBlock runMethodBody = executeMethod.body(); - helper.surroundWithTryCatch(holder, runMethodBody, previousMethodBody, "A runtime exception was thrown while executing code in a background task"); + helper.surroundWithTryCatch(holder, runMethodBody, previousMethodBody, "A runtime exception was thrown while executing code in a background task", true); Background annotation = element.getAnnotation(Background.class); String id = annotation.id(); diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ThreadActivityTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ThreadActivityTest.java index 00fda24974..8ae00b7729 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ThreadActivityTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ThreadActivityTest.java @@ -263,4 +263,26 @@ public void cancellableSerializedBackgroundTasks() { } } + @Test + public void propagateException() { + BackgroundExecutor.setExecutor(new Executor() { + @Override + public void execute(Runnable command) { + command.run(); + } + }); + try { + activity.backgroundThrowException(); + Assert.fail("Exception should be propagated in @Background annotated methods"); + } catch (RuntimeException e) { + // good + } + try { + activity.uiThreadThrowException(); + Assert.fail("Exception should be propagated in @UIThread annotated methods"); + } catch (RuntimeException e) { + // good + } + } + } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ThreadActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ThreadActivity.java index 4c6905579a..5b0e66237a 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ThreadActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ThreadActivity.java @@ -139,4 +139,14 @@ void backgrounddUsingArrayParamtersMethod(MySerializableBean[] array) { @Background void backgroundUsingArrayParamtersMethod(MySerializableBean[][] array) { } + + @Background + void backgroundThrowException() { + throw new RuntimeException(); + } + + @UiThread + void uiThreadThrowException() { + throw new RuntimeException(); + } }