|
1 | 1 | from builtins import range |
| 2 | +import traceback |
2 | 3 | from io import open |
3 | 4 |
|
4 | 5 | from gevent.threading import Timer |
@@ -262,16 +263,32 @@ def _repeated_send(ws, msg): |
262 | 263 |
|
263 | 264 | def _process_message(message, ws): |
264 | 265 | if 'call' in message: |
265 | | - return_val = _exposed_functions[message['name']](*message['args']) |
| 266 | + error_info = {} |
| 267 | + try: |
| 268 | + return_val = _exposed_functions[message['name']](*message['args']) |
| 269 | + status = 'ok' |
| 270 | + except Exception as e: |
| 271 | + err_traceback = traceback.format_exc() |
| 272 | + traceback.print_exc() |
| 273 | + return_val = None |
| 274 | + status = 'error' |
| 275 | + error_info['errorText'] = repr(e) |
| 276 | + error_info['errorTraceback'] = err_traceback |
266 | 277 | _repeated_send(ws, _safe_json({ 'return': message['call'], |
267 | | - 'value': return_val })) |
| 278 | + 'status': status, |
| 279 | + 'value': return_val, |
| 280 | + 'error': error_info,})) |
268 | 281 | elif 'return' in message: |
269 | 282 | call_id = message['return'] |
270 | 283 | if call_id in _call_return_callbacks: |
271 | | - callback = _call_return_callbacks.pop(call_id) |
272 | | - callback(message['value']) |
| 284 | + callback, error_callback = _call_return_callbacks.pop(call_id) |
| 285 | + if message['status'] == 'ok': |
| 286 | + callback(message['value']) |
| 287 | + elif message['status'] == 'error' and error_callback is not None: |
| 288 | + error_callback(message['error'], message['stack']) |
273 | 289 | else: |
274 | 290 | _call_return_values[call_id] = message['value'] |
| 291 | + |
275 | 292 | else: |
276 | 293 | print('Invalid message received: ', message) |
277 | 294 |
|
@@ -316,9 +333,9 @@ def _call_return(call): |
316 | 333 | global _js_result_timeout |
317 | 334 | call_id = call['call'] |
318 | 335 |
|
319 | | - def return_func(callback=None): |
| 336 | + def return_func(callback=None, error_callback=None): |
320 | 337 | if callback is not None: |
321 | | - _call_return_callbacks[call_id] = callback |
| 338 | + _call_return_callbacks[call_id] = (callback, error_callback) |
322 | 339 | else: |
323 | 340 | for w in range(_js_result_timeout): |
324 | 341 | if call_id in _call_return_values: |
|
0 commit comments