除了最后 - 运营商

时间:2017-09-12 09:48:56

标签: python error-handling except try-catch-finally

我有一个奇怪的问题,除了Block,特别是最后:

在第一个代码块中,最终可以正常运行,同时在第二个代码中,与第一个代码完全不同,它总是会给你一个错误。

首先:

def askint():
while True:
    try:
        val = int(raw_input("Please enter an integer: "))
    except:
        print "Looks like you did not enter an integer!"
        continue
    else:
        print 'Yep thats an integer!'
        break
    finally:
        print "Finally, I executed!"
    print val 

第二

def Abra():
while True:
    try:
        v  = int(raw_input('Geben Sie bitte einen Integer ein (1-9) : '))
    except :
        print 'Einen Integer bitte (1-9)'
        continue

    if v not in range(1,10):
        print ' Einen Integer von 1-9'
        continue
    else:
        print 'Gut gemacht'
        break
    finally:
        print "Finally, I executed!"

阿布拉()

打开所有解决方案 - 谢谢

2 个答案:

答案 0 :(得分:1)

我相信你得到的混乱来自第一个例子中的else

在“尝试/排除”阻止中,区域tryexceptelsefinally都有效。这可能会误导新程序员,因为elseif语句不同。

您可以在此处阅读:Python try-else

在第二个示例中,if语句不合适,因为它应该在整个try/except/else/finally块之外,或者正确缩进其中一个部分。

对于您的具体示例,您需要类似于此的内容:

def Abra():
    while True:
    try:
        v  = int(raw_input('Geben Sie bitte einen Integer ein (1-9) : '))
        if v not in range(1,10):
            print ' Einen Integer von 1-9'
            continue
    except :
        print 'Einen Integer bitte (1-9)'
        continue
    else:
        print 'Gut gemacht'
        break
    finally:
        print "Finally, I executed!"

虽然,我可能会建议您删除else以避免对自己造成混淆(但这是上面链接中更好讨论的论点):

def Abra():
    while True:
    try:
        v  = int(raw_input('Geben Sie bitte einen Integer ein (1-9) : '))
        if v not in range(1,10):
            print ' Einen Integer von 1-9'
            continue
        print 'Gut gemacht'
        break
    except :
        print 'Einen Integer bitte (1-9)'
        continue
    finally:
        print "Finally, I executed!"

答案 1 :(得分:0)

finally子句必须直接连接到try / except子句才能生效。在第二个代码块中,try / except和finally之间有一个if / else。因此,结构是try / except,if / else,最后,这是无效的。相反,在第一个中,else是一个块,它在异常未被引发时执行,因此是try / except的一部分 - 结构是try / except / else / finally。