Catch uncaught exceptions in from plugins and turn them into error responses.

When a plugin throws an unchecked exception, we're not catching it
anywhere and so the error callback is not being called.

This change adds a try/catch to catch such exceptions.


Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/79e313a0
Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/79e313a0
Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/79e313a0

Branch: refs/heads/pluggable_webview
Commit: 79e313a0c07d6afbb0e8ecb46e10fd432291145c
Parents: 9f4c75d
Author: Andrew Grieve <[email protected]>
Authored: Thu Mar 6 21:25:48 2014 -0500
Committer: Joe Bowser <[email protected]>
Committed: Mon Mar 17 11:58:14 2014 -0700

----------------------------------------------------------------------
 framework/src/org/apache/cordova/PluginManager.java | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/79e313a0/framework/src/org/apache/cordova/PluginManager.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/PluginManager.java 
b/framework/src/org/apache/cordova/PluginManager.java
index e9795e8..f095722 100755
--- a/framework/src/org/apache/cordova/PluginManager.java
+++ b/framework/src/org/apache/cordova/PluginManager.java
@@ -236,22 +236,25 @@ public class PluginManager {
             app.sendPluginResult(cr, callbackId);
             return;
         }
+        CallbackContext callbackContext = new CallbackContext(callbackId, app);
         try {
-            CallbackContext callbackContext = new CallbackContext(callbackId, 
app);
             long pluginStartTime = System.currentTimeMillis();
             boolean wasValidAction = plugin.execute(action, rawArgs, 
callbackContext);
             long duration = System.currentTimeMillis() - pluginStartTime;
-            
+
             if (duration > SLOW_EXEC_WARNING_THRESHOLD) {
                 Log.w(TAG, "THREAD WARNING: exec() call to " + service + "." + 
action + " blocked the main thread for " + duration + "ms. Plugin should use 
CordovaInterface.getThreadPool().");
             }
             if (!wasValidAction) {
                 PluginResult cr = new 
PluginResult(PluginResult.Status.INVALID_ACTION);
-                app.sendPluginResult(cr, callbackId);
+                callbackContext.sendPluginResult(cr);
             }
         } catch (JSONException e) {
             PluginResult cr = new 
PluginResult(PluginResult.Status.JSON_EXCEPTION);
-            app.sendPluginResult(cr, callbackId);
+            callbackContext.sendPluginResult(cr);
+        } catch (Exception e) {
+            Log.e(TAG, "Uncaught exception from plugin", e);
+            callbackContext.error(e.getMessage());
         }
     }
 

Reply via email to