1

当我将小部件更新链接到函数并在面板中显示输出时,将小部件更新为函数无法处理的值导致的错误会导致函数静默失败,而不是终止面板的执行并显示回溯.

在以下示例中,x未定义,因此当将滑块拖动到5时,函数会静默失败,并且不会更新输出值。如果滑块起始值设置为5,该函数将按NameError预期提高 a 并且面板不会被初始化。

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')

我希望在小部件值更改导致错误时引发错误,以便清楚何时发生错误以及追溯发生了什么。我怎样才能用面板实现这一点?(我在使用管道的调试模式下看到了这个问题,但在面板上找不到类似的东西)。

我一直在 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
4

2 回答 2

0

在面板问题跟踪器上问了这个问题,并收到了可以在 JS 控制台中看到错误的响应。在 Firefox 上,您可以使用Ctrl-Shift-k或右键单击 -> 检查元素 -> 控制台打开它。在 Chrome 中,它是Ctrl-Shift-c或右键单击 -> 检查 -> 控制台。

这个 SO 答案显示了如何将控制台嵌入到 div 中,以便它可以与其他元素一起直接显示在应用程序中。

于 2019-08-05T22:29:23.050 回答
0

嘿,所以我有一个类似的问题,并想出了一个“小部件”解决这个问题。这个想法是您捕获错误,将其格式化为 html,然后将错误输出到仪表板中已经存在的小部件中。

在下面的示例中,您可以看到我有一个仪表板,它会在按下提交后返回您输入的几乎所有字符串,但字符串“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

结果是:

在此处输入图像描述

于 2021-04-20T14:34:23.690 回答