如何使用散景库 (Python + JavaScript) 管理错误并将它们显示在用户界面上?

How to manage errors with bokeh library (Python + JavaScript) and show them on the user interface?

我在 Bokeh Server Application 中使用 Python 库 "Bokeh" 工作,我通常会遇到两种类型的错误。

我可以实现的是创建继承 python 中的 Exception class 的手动异常。通过这种方式,我可以在 class.

引发错误时编写自定义消息和 运行 一些操作
class ManualException(Exception):
    def __init__(self, value):
        self.value = value

        # some actions

    def __str__(self):
        return repr(
            'MANUAL ERROR\n' + self.value
        )

但是如果发生任何其他异常,那么我不知道如何将它们捕获到 运行 一些自定义操作。我试过这个:

try:
    n = 9 / 0
except Exception:
    tb = sys.exc_info()[2]
    raise ManualException('ZERO ERROR').with_traceback(tb)

在这里,我必须手动捕获任何错误,并使用我创建的手动 class 提出它们,然后两者都会出现在 python 记录器中。这是执行此操作的正确方法吗?

2017-09-04 17:08:58,872 Error running application handler <bokeh.application.handlers.directory.DirectoryHandler object at 0x0000023E2435C208>: 'MANUAL ERROR\nZERO ERROR'
File "main.py", line 11, in <module>:
n = 9 / 0 Traceback (most recent call last):
File "[...]\main.py", line 11, in <module>
    n = 9 / 0
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "[...]\lib\site-packages\bokeh\application\handlers\code_runner.py", line 125, in run
    exec(self._code, module.__dict__)
File "[...]\main.py", line 14, in <module>
    raise ManualException('ZERO ERROR').with_traceback(tb)
File "[...]\main.py", line 11, in <module>
    n = 9 / 0
exceptions.ManualException: 'MANUAL ERROR\n'ZERO ERROR'

无论如何我想避免这种情况,因为我想向用户显示所有类型的错误,即使我不使用 try-except 来捕获异常也是如此。

另一方面,如果发生 python 错误,则会显示 JavaScript 消息。所以我认为最好的选择是将一些 JavaScript 方法重写为 运行 一些自定义 js 代码。我怎么能做到这一点?这可以实现吗?

我得到了。可以将一些侦听器添加到 window 以获取 JavaScript 错误消息

You can handle it as an event listener on window object.

window.onunhandledrejection = function(event) {
  console.warn(`UNHANDLED PROMISE REJECTION: ${event.reason}`);
};

window.onerror = function(event) {
  console.warn(`UNHANDLED ERROR: ${event.message}`);
};

Or also like this:

 window.addEventListener('error', function(event) { ... })

You can read more about the unhandledrejection event on the MDN web docs here and the onerror event on the docs here