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(); + } }