diff options
author | Alexander Dorokhine <adorokhine@google.com> | 2017-02-03 23:22:19 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-03 23:22:19 -0800 |
commit | 98a2346c2cf8e55b1e29a1a566f2656ac1fac910 (patch) | |
tree | 303bb007d2136fe904a2aa9a6222a24fe587fa2b /third_party | |
parent | 03478b839c4dbef91869c617eba6410e3fba2ecc (diff) | |
download | mobly-snippet-lib-98a2346c2cf8e55b1e29a1a566f2656ac1fac910.tar.gz |
Fix exception handling in snippets. (#32)
* Don't try to call methods on snippet classes that couldn't be constructed
* Don't obscure the cause of exceptions
* Propagate the entire stack trace to the python side
* Decorate the stacktrace
Diffstat (limited to 'third_party')
3 files changed, 22 insertions, 24 deletions
diff --git a/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/manager/SnippetManager.java b/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/manager/SnippetManager.java index edb872b..e27c473 100644 --- a/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/manager/SnippetManager.java +++ b/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/manager/SnippetManager.java @@ -19,6 +19,7 @@ package com.google.android.mobly.snippet.manager; import android.os.Build; import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collection; import java.util.HashMap; @@ -63,7 +64,7 @@ public class SnippetManager { } public Object invoke(Class<? extends Snippet> clazz, Method method, Object[] args) - throws Exception { + throws Throwable { if (method.isAnnotationPresent(RpcMinSdk.class)) { int requiredSdkLevel = method.getAnnotation(RpcMinSdk.class).value(); if (Build.VERSION.SDK_INT < requiredSdkLevel) { @@ -72,8 +73,12 @@ public class SnippetManager { method.getName(), requiredSdkLevel, Build.VERSION.SDK_INT)); } } - Snippet object = get(clazz); - return method.invoke(object, args); + try { + Snippet object = get(clazz); + return method.invoke(object, args); + } catch (InvocationTargetException e) { + throw e.getCause(); + } } public void shutdown() { @@ -88,21 +93,16 @@ public class SnippetManager { } } - private Snippet get(Class<? extends Snippet> clazz) { + private Snippet get(Class<? extends Snippet> clazz) throws Exception { Snippet object = mReceivers.get(clazz); if (object != null) { return object; } Constructor<? extends Snippet> constructor; - try { - constructor = clazz.getConstructor(); - object = constructor.newInstance(); - mReceivers.put(clazz, object); - } catch (Exception e) { - Log.e(e); - } - + constructor = clazz.getConstructor(); + object = constructor.newInstance(); + mReceivers.put(clazz, object); return object; } } diff --git a/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/JsonRpcResult.java b/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/JsonRpcResult.java index 0c1d0f2..ce02344 100644 --- a/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/JsonRpcResult.java +++ b/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/JsonRpcResult.java @@ -16,6 +16,8 @@ package com.google.android.mobly.snippet.rpc; +import java.io.PrintWriter; +import java.io.StringWriter; import org.json.JSONException; import org.json.JSONObject; @@ -48,10 +50,16 @@ public class JsonRpcResult { } public static JSONObject error(int id, Throwable t) throws JSONException { + StringWriter stackTraceWriter = new StringWriter(); + stackTraceWriter.write("\n-------------- Java Stacktrace ---------------\n"); + t.printStackTrace(new PrintWriter(stackTraceWriter)); + stackTraceWriter.write("----------------------------------------------"); + String stackTrace = stackTraceWriter.toString(); + JSONObject json = new JSONObject(); json.put("id", id); json.put("result", JSONObject.NULL); - json.put("error", t.toString()); + json.put("error", stackTrace); return json; } } diff --git a/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/MethodDescriptor.java b/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/MethodDescriptor.java index 8d18582..862278e 100644 --- a/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/MethodDescriptor.java +++ b/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/MethodDescriptor.java @@ -88,17 +88,7 @@ public final class MethodDescriptor { } } - return invoke(manager, args); - } - - private Object invoke(SnippetManager manager, Object[] args) throws Throwable { - Object result; - try { - result = manager.invoke(mClass, mMethod, args); - } catch (Throwable t) { - throw t.getCause(); - } - return result; + return manager.invoke(mClass, mMethod, args); } /** |