这是我脚本的一部分:
try:
read2length = len(reads[1])
x2 = data[read1length:read1length+read2length,0]
y2 = data[read1length:read1length+read2length,1]
fig = plt.figure()
plt.bar(x2,y2, align='center')
fig.suptitle('Read 2 Camera Timeouts', fontsize=20)
plt.xlabel('Cycle', fontsize=18)
plt.ylabel('#', fontsize=16)
if read2length < 50:
plt.xticks(x1, fontsize=14)
fig.savefig(join((path),'Read 2 Camera Timeouts.jpg'))
except: pass
try:
read3length = len(reads[2])
x3 = data[read1length+read2length:read1length+read2length+read3length,0]
y3 = data[read1length+read2length:read1length+read2length+read3length,1]
fig = plt.figure()
plt.bar(x3,y3, align='center')
fig.suptitle('Read 3 Camera Timeouts', fontsize=20)
plt.xlabel('Cycle', fontsize=18)
plt.ylabel('#', fontsize=16)
if read3length < 50:
plt.xticks(x1, fontsize=14)
fig.savefig(join((path),'Read 3 Camera Timeouts.jpg'))
except: pass
我希望脚本尝试第一个和第二个。他们是否工作我希望脚本继续。
我一直没有定义read2length?
怎么回事?
答案 0 :(得分:5)
如果表达式len(reads[1])
引发异常(例如IndexError
),则永远不会将名称read2length
分配给。{/ p>
如果您的下一个try
块尝试使用该名称 ,则会导致异常。
你真的不应该使用pokemon exception handling(你不要想要抓住它们,真的)。保持您的异常处理尽可能接近抛出异常的代码,并且仅处理特定的异常。
例如,如果您想处理reads[1]
抛出索引错误,那么只处理该异常:
try:
read2length = len(reads[1])
except IndexError:
# not enough elements here; assume 0
read2length = 0
else:
x2 = data[read1length:read1length+read2length,0]
y2 = data[read1length:read1length+read2length,1]
fig = plt.figure()
plt.bar(x2,y2, align='center')
fig.suptitle('Read 2 Camera Timeouts', fontsize=20)
plt.xlabel('Cycle', fontsize=18)
plt.ylabel('#', fontsize=16)
if read2length < 50:
plt.xticks(x1, fontsize=14)
fig.savefig(join((path),'Read 2 Camera Timeouts.jpg'))
现在read2length
始终绑定一个整数。
答案 1 :(得分:1)
如果未定义read2length
,则问题出在第2行,其中len(读取[1])会引发异常。
打印reads
以查看原因。
您还应修改except: pass
并使用:
except:
print "Unexpected error:", sys.exc_info()[0]
不要忘记导入sys before
答案 2 :(得分:1)
这样:
try:
read2length = len(reads[1])
x2 = data[read1length:read1length+read2length,0]
y2 = data[read1length:read1length+read2length,1]
fig = plt.figure()
plt.bar(x2,y2, align='center')
fig.suptitle('Read 2 Camera Timeouts', fontsize=20)
plt.xlabel('Cycle', fontsize=18)
plt.ylabel('#', fontsize=16)
if read2length < 50:
plt.xticks(x1, fontsize=14)
fig.savefig(join((path),'Read 2 Camera Timeouts.jpg'))
except: pass
try:
read3length = len(reads[2])
x3 = data[read1length+read2length:read1length+read2length+read3length,0]
y3 = data[read1length+read2length:read1length+read2length+read3length,1]
fig = plt.figure()
plt.bar(x3,y3, align='center')
fig.suptitle('Read 3 Camera Timeouts', fontsize=20)
plt.xlabel('Cycle', fontsize=18)
plt.ylabel('#', fontsize=16)
if read3length < 50:
plt.xticks(x1, fontsize=14)
fig.savefig(join((path),'Read 3 Camera Timeouts.jpg'))
except: pass
print 'foo'
结果
$ python q2.py
foo
在我的系统上。我的猜测是你在第二个try-catch块之后引用了read2length。
并注意其他人所说的“除了:通过”是不好的做法。
答案 3 :(得分:0)
您在第一次尝试时定义read2length:
try:
read2length = len(reads[1])
这意味着如果尝试失败,那么read2length永远不会被定义。因此,当您尝试在第二次尝试中使用它时:
try:
read3length = len(reads[2])
x3 = data[read1length+read2length:read1length+read2length+read3length,0]
y3 = data[read1length+read2length:read1length+read2length+read3length,1]
由于udnefined变量,它总是会失败。
通过在第一次尝试使用except来改变它:
except:
read2length = 0
编辑:Martijn也打败了我,但他的回答更好,因为你不应该有通用的例外(或使用传球)。