mirror of
https://github.com/apache/cordova-android.git
synced 2025-02-26 12:03:28 +08:00
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.
This commit is contained in:
parent
9f4c75d1c2
commit
79e313a0c0
@ -236,22 +236,25 @@ public class PluginManager {
|
|||||||
app.sendPluginResult(cr, callbackId);
|
app.sendPluginResult(cr, callbackId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
CallbackContext callbackContext = new CallbackContext(callbackId, app);
|
||||||
try {
|
try {
|
||||||
CallbackContext callbackContext = new CallbackContext(callbackId, app);
|
|
||||||
long pluginStartTime = System.currentTimeMillis();
|
long pluginStartTime = System.currentTimeMillis();
|
||||||
boolean wasValidAction = plugin.execute(action, rawArgs, callbackContext);
|
boolean wasValidAction = plugin.execute(action, rawArgs, callbackContext);
|
||||||
long duration = System.currentTimeMillis() - pluginStartTime;
|
long duration = System.currentTimeMillis() - pluginStartTime;
|
||||||
|
|
||||||
if (duration > SLOW_EXEC_WARNING_THRESHOLD) {
|
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().");
|
Log.w(TAG, "THREAD WARNING: exec() call to " + service + "." + action + " blocked the main thread for " + duration + "ms. Plugin should use CordovaInterface.getThreadPool().");
|
||||||
}
|
}
|
||||||
if (!wasValidAction) {
|
if (!wasValidAction) {
|
||||||
PluginResult cr = new PluginResult(PluginResult.Status.INVALID_ACTION);
|
PluginResult cr = new PluginResult(PluginResult.Status.INVALID_ACTION);
|
||||||
app.sendPluginResult(cr, callbackId);
|
callbackContext.sendPluginResult(cr);
|
||||||
}
|
}
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
PluginResult cr = new PluginResult(PluginResult.Status.JSON_EXCEPTION);
|
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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user