引发错误并显示来自面板仪表板的回溯消息
Raise errors and display traceback messages from panel dashboards
当我 link 小部件更新为函数并在面板中显示输出时,由于将小部件更新为函数无法处理的值而导致的错误导致函数静默失败而不是终止面板的执行并显示回溯。
在下面的示例中,x
未定义,因此当将滑块拖动到 5
时,函数会自动失败并且不会更新输出值。如果滑块起始值设置为 5
,该函数将按预期引发 NameError
,并且不会初始化面板。
import panel as pn
pn.extension()
int_slider = pn.widgets.IntSlider(
name='Integer Slider', value=1, end=5)
@pn.depends(int_slider.param.value, watch=True)
def print_slider_value(slider_value):
if slider_value <= 4:
return slider_value
else:
return slider_value * x
pn.Column(int_slider, print_slider_value) #.app('localhost:8888')
我希望在小部件值更改时引发错误,以便清楚何时发生错误以及从回溯中发生了什么。我怎样才能用面板实现这一目标? (我在带有管道的调试模式下看到 this issue,但找不到任何类似的面板)。
我一直在使用以下软件包版本的 JupyterLab 笔记本中尝试此操作
bokeh 1.2.0
panel 0.6.0
param 1.9.1
IPython 6.5.0
jupyter_client 5.2.3
jupyter_core 4.4.0
jupyterlab 1.0.2
notebook 5.6.0
我asked this question on the panel issue tracker并收到了可以在JS控制台中看到错误的响应。在 Firefox 上,您可以使用 Ctrl-Shift-k
或右键单击 -> 检查元素 -> 控制台打开它。在 Chrome 中是 Ctrl-Shift-c
或右键单击 -> 检查 -> 控制台。
展示了如何将控制台嵌入 div 以便它可以与其他元素一起直接显示在应用程序中。
嘿,所以我遇到了类似的问题,并想出了一个“小部件”解决方案来解决这个问题。这个想法是您捕获错误,将其格式化为 html,然后将错误输出到仪表板内已有的小部件中。
在下面的示例中,您可以看到我有一个仪表板,它会 return 按下提交后输入的几乎所有字符串,字符串“roger”除外。如果在仪表板中输入“roger”,将在笔记本/面板应用程序本身中直接向用户显示回溯。
import panel as pn
import traceback as tb
from pygments import highlight
from pygments.lexers import Python3TracebackLexer
from pygments.formatters import HtmlFormatter
pn.extension()
toggle = pn.widgets.Toggle(name='Press Here')
field = pn.widgets.TextInput(placeholder='Type something here . . .', visible=False)
submit = pn.widgets.Button(name='Submit', button_type='primary', visible=False)
out = pn.widgets.StaticText(value='orginal output')
def extract_format_tb_html(e):
traceback_str = ''.join(tb.format_exception(None, e, e.__traceback__))
return highlight(traceback_str, Python3TracebackLexer(), HtmlFormatter(noclasses=True))
def myfunc(x):
if x != 'roger':
out.value = field.value
else:
raise
def test(event):
try:
myfunc(field.value)
except Exception as e:
out.value = extract_format_tb_html(e)
def callback(target, event):
if event.new:
target.visible=True
else:
target.visible=False
toggle.link(field, callbacks={'value': callback})
toggle.link(submit, callbacks={'value': callback})
submit.on_click(test)
widget_row = pn.Row(toggle, field, submit)
dashboard = pn.Column(widget_row, out)
dashboard
结果是:
截至版本 0.13.0, you can get this functionality out of the box via the Debugging widget。
例如
logger = logging.getLogger('panel.myapp')
debug_info = pn.widgets.Debugger(
name='Debugger info level',
level=logging.INFO,
sizing_mode='stretch_both',
# comment this line out to get all panel errors
logger_names=['panel.myapp']
)
当我 link 小部件更新为函数并在面板中显示输出时,由于将小部件更新为函数无法处理的值而导致的错误导致函数静默失败而不是终止面板的执行并显示回溯。
在下面的示例中,x
未定义,因此当将滑块拖动到 5
时,函数会自动失败并且不会更新输出值。如果滑块起始值设置为 5
,该函数将按预期引发 NameError
,并且不会初始化面板。
import panel as pn
pn.extension()
int_slider = pn.widgets.IntSlider(
name='Integer Slider', value=1, end=5)
@pn.depends(int_slider.param.value, watch=True)
def print_slider_value(slider_value):
if slider_value <= 4:
return slider_value
else:
return slider_value * x
pn.Column(int_slider, print_slider_value) #.app('localhost:8888')
我希望在小部件值更改时引发错误,以便清楚何时发生错误以及从回溯中发生了什么。我怎样才能用面板实现这一目标? (我在带有管道的调试模式下看到 this issue,但找不到任何类似的面板)。
我一直在使用以下软件包版本的 JupyterLab 笔记本中尝试此操作
bokeh 1.2.0
panel 0.6.0
param 1.9.1
IPython 6.5.0
jupyter_client 5.2.3
jupyter_core 4.4.0
jupyterlab 1.0.2
notebook 5.6.0
我asked this question on the panel issue tracker并收到了可以在JS控制台中看到错误的响应。在 Firefox 上,您可以使用 Ctrl-Shift-k
或右键单击 -> 检查元素 -> 控制台打开它。在 Chrome 中是 Ctrl-Shift-c
或右键单击 -> 检查 -> 控制台。
嘿,所以我遇到了类似的问题,并想出了一个“小部件”解决方案来解决这个问题。这个想法是您捕获错误,将其格式化为 html,然后将错误输出到仪表板内已有的小部件中。
在下面的示例中,您可以看到我有一个仪表板,它会 return 按下提交后输入的几乎所有字符串,字符串“roger”除外。如果在仪表板中输入“roger”,将在笔记本/面板应用程序本身中直接向用户显示回溯。
import panel as pn
import traceback as tb
from pygments import highlight
from pygments.lexers import Python3TracebackLexer
from pygments.formatters import HtmlFormatter
pn.extension()
toggle = pn.widgets.Toggle(name='Press Here')
field = pn.widgets.TextInput(placeholder='Type something here . . .', visible=False)
submit = pn.widgets.Button(name='Submit', button_type='primary', visible=False)
out = pn.widgets.StaticText(value='orginal output')
def extract_format_tb_html(e):
traceback_str = ''.join(tb.format_exception(None, e, e.__traceback__))
return highlight(traceback_str, Python3TracebackLexer(), HtmlFormatter(noclasses=True))
def myfunc(x):
if x != 'roger':
out.value = field.value
else:
raise
def test(event):
try:
myfunc(field.value)
except Exception as e:
out.value = extract_format_tb_html(e)
def callback(target, event):
if event.new:
target.visible=True
else:
target.visible=False
toggle.link(field, callbacks={'value': callback})
toggle.link(submit, callbacks={'value': callback})
submit.on_click(test)
widget_row = pn.Row(toggle, field, submit)
dashboard = pn.Column(widget_row, out)
dashboard
结果是:
截至版本 0.13.0, you can get this functionality out of the box via the Debugging widget。
例如
logger = logging.getLogger('panel.myapp')
debug_info = pn.widgets.Debugger(
name='Debugger info level',
level=logging.INFO,
sizing_mode='stretch_both',
# comment this line out to get all panel errors
logger_names=['panel.myapp']
)