尝试:/ except:传递不继续脚本的其余部分?

时间:2014-04-30 12:35:37

标签: python try-catch except

这是我脚本的一部分:

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?

怎么回事?

4 个答案:

答案 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也打败了我,但他的回答更好,因为你不应该有通用的例外(或使用传球)。