有点背景 - 我有一个Python程序可以从CSV文件中绘制图表。我试图通过允许用户输入1到3个文件来使它更加灵活。我将csv数据导入到熊猫数据框中,然后用它们生成许多不同的图。我确信有更好的方式来做我正在做的事情,但在我最初尝试弄清楚用户是否输入了小于最大数目的情况下,我遇到了一些奇怪的事情(对我来说,至少)的文件。为什么我无法在Python中的block中同时捕获NameError和UnboundLocalError?
这是我如何导入数据:
# 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)
所以data2
和data3
如果用户已经从我的GUI提供的文件名只定义。后来,我只是想用的data2
和data3
的存在,以确定是否要分别绘制第二和第三个数据集:
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的块之外没有像我期望的那样传递。如果我试图捕获UnboundLocalError,则会引发NameError。如果我试图捕获一个NameError,则会引发UnboundLocalError。有人可以向我解释发生了什么事吗?
编辑 - 这里的回溯:
请包括一个完整的堆栈跟踪。 – DyZ
这是Python 2还是Python 3? – jwodder
试图将其归结为一个独立的例子也是有用的。首先,这使得更容易关注实际问题。另一方面,它经常揭示一个潜在的原因。我怀疑这一次,引用'NameError'不应该抛出任何异常。 –