diff --git a/IPython/html/static/services/kernels/js/comm.js b/IPython/html/static/services/kernels/js/comm.js
index 91760ac..87bb62b 100644
--- a/IPython/html/static/services/kernels/js/comm.js
+++ b/IPython/html/static/services/kernels/js/comm.js
@@ -49,7 +49,7 @@ var IPython = (function (IPython) {
// Unregister a target function for a given target name
delete this.targets[target_name];
};
-
+
CommManager.prototype.register_comm = function (comm) {
// Register a comm in the mapping
this.comms[comm.comm_id] = comm;
@@ -74,7 +74,13 @@ var IPython = (function (IPython) {
}
var comm = new Comm(content.comm_id);
this.register_comm(comm);
- f(comm, msg);
+ try {
+ f(comm, msg);
+ } catch (e) {
+ console.log("Exception opening new comm:", e, msg);
+ comm.close();
+ this.unregister_comm(comm);
+ }
};
CommManager.prototype.comm_close = function (msg) {
@@ -84,7 +90,11 @@ var IPython = (function (IPython) {
return;
}
delete this.comms[content.comm_id];
- comm.handle_close(msg);
+ try {
+ comm.handle_close(msg);
+ } catch (e) {
+ console.log("Exception closing comm: ", e, msg);
+ }
};
CommManager.prototype.comm_msg = function (msg) {
@@ -93,7 +103,11 @@ var IPython = (function (IPython) {
if (comm === undefined) {
return;
}
- comm.handle_msg(msg);
+ try {
+ comm.handle_msg(msg);
+ } catch (e) {
+ console.log("Exception handling comm msg: ", e, msg);
+ }
};
//-----------------------------------------------------------------------
diff --git a/IPython/kernel/comm/manager.py b/IPython/kernel/comm/manager.py
index 14fbdd7..312bafa 100644
--- a/IPython/kernel/comm/manager.py
+++ b/IPython/kernel/comm/manager.py
@@ -79,8 +79,10 @@ class CommManager(LoggingConfigurable):
def register_target(self, target_name, f):
"""Register a callable f for a given target name
- f will be called with a Comm object as its only argument
- when a comm_open message is received with `target`.
+ f will be called with two arguments when a comm_open message is received with `target`:
+
+ - the Comm instance
+ - the `comm_open` message itself.
f can be a Python callable or an import string for one.
"""
@@ -92,7 +94,7 @@ class CommManager(LoggingConfigurable):
def unregister_target(self, target_name, f):
"""Unregister a callable registered with register_target"""
return self.targets.pop(target_name);
-
+
def register_comm(self, comm):
"""Register a new comm"""
comm_id = comm.comm_id
@@ -141,7 +143,12 @@ class CommManager(LoggingConfigurable):
comm.close()
return
self.register_comm(comm)
- f(comm, msg)
+ try:
+ f(comm, msg)
+ except Exception:
+ self.log.error("Exception opening comm with target: %s", target_name, exc_info=True)
+ comm.close()
+ self.unregister_comm(comm_id)
@with_output
def comm_msg(self, stream, ident, msg):
@@ -152,7 +159,10 @@ class CommManager(LoggingConfigurable):
if comm is None:
# no such comm
return
- comm.handle_msg(msg)
+ try:
+ comm.handle_msg(msg)
+ except Exception:
+ self.log.error("Exception in comm_msg for %s", comm_id, exc_info=True)
@with_output
def comm_close(self, stream, ident, msg):
@@ -162,9 +172,14 @@ class CommManager(LoggingConfigurable):
comm = self.get_comm(comm_id)
if comm is None:
# no such comm
+ self.log.debug("No such comm to close: %s", comm_id)
return
del self.comms[comm_id]
- comm.handle_close(msg)
+
+ try:
+ comm.handle_close(msg)
+ except Exception:
+ self.log.error("Exception handling comm_close for %s", comm_id, exc_info=True)
__all__ = ['CommManager']