为何try语句无法捕获Matplotlib数学文本的ParseException异常?
问题根源:异常触发时机不在try块覆盖范围内
你的try语句之所以捕获不到ParseException,核心原因是数学文本的解析异常并不是在创建FigureCanvas时抛出的,而是在wx的事件循环触发图表首次渲染时才发生,这个过程已经脱离了你写的try...except代码块的执行上下文。
具体过程拆解:
fig.suptitle('$$')只是将错误的LaTeX文本存入Figure对象,此时Matplotlib不会立刻解析语法,而是延迟到实际渲染图表时才执行解析操作;- 你用try包裹的
self.canvas = FigureCanvas(self, 0, fig)只是完成Canvas对象的初始化,并没有触发图表渲染; - 当wx的事件循环启动后,窗口首次绘制时才会触发Matplotlib的渲染流程,此时才会解析标题文本并抛出异常——但这个时候try块已经执行完毕,自然捕获不到异常。
修正方案:在try块内强制触发渲染
要捕获解析异常,需要把设置标题和强制渲染的逻辑都放在try块里,让异常在try块执行期间抛出:
import matplotlib.pyplot as plt from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas import wx from pyparsing.exceptions import ParseException class MyApp(wx.App): def OnInit(self): self.frame = MainFrame(parent=None, title="Test") self.frame.Show() return True class MainFrame(wx.Frame): def __init__(self, parent, title): wx.Frame.__init__(self, None, -1, title=title) try: fig = plt.figure() fig.suptitle('$$') # 强制触发渲染,让解析异常立刻在try块内抛出 fig.canvas.draw() self.canvas = FigureCanvas(self, 0, fig) except (ParseException, ValueError): # 捕获解析错误,创建带默认标题的图表 fig = plt.figure() fig.suptitle("标题格式错误") self.canvas = FigureCanvas(self, 0, fig) finally: plt.close('all') hbox = wx.BoxSizer(wx.HORIZONTAL) hbox.Add(self.canvas) self.SetSizer(hbox) if __name__ == "__main__": app = MyApp() app.MainLoop()
补充说明
你之前用set_parse_math(False)能避免错误,是因为这个配置直接禁用了Matplotlib的LaTeX语法解析,从根源上消除了解析异常的触发条件,属于规避方案;而上面的修正方案则是主动捕获异常,让程序在遇到错误标题时能优雅降级。
内容的提问来源于stack exchange,提问作者roural
相关产品推荐
相关产品推荐

