【问题标题】:Why am I not able to catch both NameError and UnboundLocalError in the same except block in Python?为什么我无法在 Python 的同一块中同时捕获 NameError 和 UnboundLocalError ?
【发布时间】:2017-08-04 18:38:39
【问题描述】:

一点背景知识——我有一个 Python 程序,它可以从 CSV 文件中绘制图表。我试图通过允许用户输入 1 到 3 个文件来使其更加灵活。我将 csv 数据导入 pandas 数据帧,然后使用这些数据帧生成许多不同的图。

我确信有更好的方法来做我正在做的事情,但在我最初尝试确定用户输入的输入是否少于最大数量时遇到了一些奇怪的事情(至少对我来说是这样)文件。

这是我导入数据的方式:

# Imports the data.  The first two rows must be skipped due to the file format
data1 = pd.read_csv(filename1, skiprows=1, header=True)
if filename2 != '':
    data2 = pd.read_csv(filename2, skiprows=1, header=True)
if filename3 != '':
    data3 = pd.read_csv(filename3, skiprows=1, header=True)

所以 data2data3 仅在用户从我的 GUI 提供文件名时才定义。后来我只想利用data2data3的存在来判断是否分别绘制2nd和3rd数据集:

    try:
        axarr[1, 0].psd(data1[Ynew], NFFT=n_samples, Fs=fs, noverlap=n_overlap, window=mlab.window_hanning, label=baseFileName1)
    except KeyError:
        axarr[1, 0].psd(data1[Yold], NFFT=n_samples, Fs=fs, noverlap=n_overlap, window=mlab.window_hanning, label=baseFileName1)
    try:
        axarr[1, 0].psd(data2[Ynew], NFFT=n_samples, Fs=fs, noverlap=n_overlap, window=mlab.window_hanning, label=baseFileName2)
    except (UnboundLocalError, NameError):
        pass
    except KeyError:
        axarr[1, 0].psd(data2[Yold], NFFT=n_samples, Fs=fs, noverlap=n_overlap, window=mlab.window_hanning, label=baseFileName2)
    try:
        axarr[1, 0].psd(data3[Ynew], NFFT=n_samples, Fs=fs, noverlap=n_overlap, window=mlab.window_hanning, label=baseFileName3)
    except (UnboundLocalError, NameError):
        pass
    except KeyError:
        axarr[1, 0].psd(data3[Yold], NFFT=n_samples, Fs=fs, noverlap=n_overlap, window=mlab.window_hanning, label=baseFileName3)

这就是奇怪的地方。当我运行这个东西时,它会抛出一个 UnboundLocalError 告诉我在分配之前引用了“NameError”。因此,应该捕获 UnboundLocalError 的 except 块不会像我预期的那样通过。如果我尝试仅捕获 UnboundLocalError,则会引发 NameError。如果我尝试仅捕获 NameError,则会引发 UnboundLocalError。有人可以向我解释这里发生了什么吗?

编辑-这是回溯:

Error Traceback

【问题讨论】:

  • 请包含完整的堆栈跟踪。
  • 这是 Python 2 还是 Python 3?
  • 尝试将其归结为一个独立的示例也很有用。一方面,这使得更容易专注于实际问题。另一方面,它经常揭示一个根本原因。我怀疑这次会,引用NameError 不应该抛出任何异常。
  • @jwodder -- Python 2.7
  • 很可能,你不小心在某处写了except UnboundLocalError, NameError,没有括号,创建了一个名为NameError的局部变量。

标签: python error-handling


【解决方案1】:

我已经多次重新审视了这个问题,似乎有关于这种问题的错误报告。无论如何,异常是相对昂贵的操作。您可以使用以下方法来规避您的问题并减少周期。

data1 = None
data2 = None
data3 = None
if filename1 != '':
    data1 = ...
if filename2 != '':
    data2 = ...
if filename3 != '':
    data3 = ...

if data1 is not None:
    if Ynew in data1:
        axarr[1,0].psd(data1[Ynew] ...
    elif Yold in data1:
        axarr[1,0].psd(data1[Yold] ...
if data2 is not None:
    if Ynew in data2:
        axarr[1,0].psd(data2[Ynew] ...
    elif Yold in data2:
        axarr[1,0].psd(data2[Yold] ...
if data3 is not None:
    if Ynew in data3:
        axarr[1,0].psd(data3[Ynew] ...
    elif Yold in data3:
        axarr[1,0].psd(data3[Yold] ...

【讨论】:

  • 捕获异常可能比一直在 dataN 上进行 O(n) 搜索成本更低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2021-06-27
  • 2012-06-13
  • 1970-01-01
相关资源
最近更新 更多