如何使用散景库 (Python + JavaScript) 管理错误并将它们显示在用户界面上?
How to manage errors with bokeh library (Python + JavaScript) and show them on the user interface?
我在 Bokeh Server Application 中使用 Python 库 "Bokeh" 工作,我通常会遇到两种类型的错误。
- JavaScript Chromium 控制台上的错误
- Python 服务器端的错误,它们出现在 Tornado 记录器中。 Bokeh 与 Tornado Web 服务器一起工作
我可以实现的是创建继承 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
我在 Bokeh Server Application 中使用 Python 库 "Bokeh" 工作,我通常会遇到两种类型的错误。
- JavaScript Chromium 控制台上的错误
- Python 服务器端的错误,它们出现在 Tornado 记录器中。 Bokeh 与 Tornado Web 服务器一起工作
我可以实现的是创建继承 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 代码。我怎么能做到这一点?这可以实现吗?
我得到了
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 theonerror
event on the docs here