试用语句(Python)

时间:2015-03-07 02:57:51

标签: python oop try-catch

我最近发现try声明(我很新),我知道except,但我有一些问题:

1)我如何使用finally

2)你有多个except个不同的错误吗?

你能举一些这方面的例子吗?

1 个答案:

答案 0 :(得分:3)

对你要求的一切回答是肯定的。

try:
    raise ArithmeticError
except ValueError:
    print("caught valueerror")
except RuntimeError:
    print("caught runtimeerror")
finally:
    print("I'll do this everytime")

输出:

I'll do this everytime

Traceback (most recent call last):
  File "<pyshell#13>", line 2, in <module>
    raise ArithmeticError
ArithmeticError

简而言之。要获得完整的解释,你最好看一个教程,其中有数百万在线。我喜欢这样做的一些一般规则是:

  • 使用try块包围最短的代码片段。这有助于隔离发生错误的完全
  • 尽可能保持您的例外情况。尽量不要抓住通用,除非我如下所示。它有时很有用,但很少这样你应该尝试永远不要这样做。
  • 终于执行了。最后始终发生,如果发生错误,如果没有,如果你发现错误,或者如果你没有,最后将永远执行。使用它为代码创建一个干净的出口。关闭所有打开的文件,保存您可能拥有的所有数据结构并绑定所有松散的结尾。

我们已经看到了当您遇到错误时最终的行为方式,除了上述情况之外没有其他错误,这里举例说明当您引发错误时除外:

try:
    raise ValueError
except ValueError:
    print("caught valueerror")
except RuntimeError:
    print("caught runtimeerror")
finally:
    print("I'll do this everytime")

caught valueerror
I'll do this everytime

即使您没有遇到错误,最终也会发生:

try:
    pass
except ValueError:
    print("caught valueerror")
finally:
    print("I'll do this everytime")

I'll do this everytime

有几种方法可以捕获任何错误(总是试图避免这种情况):

try:
    raise ArithmeticError
except BaseException as e:
    print("caught unknown error: ", e)
finally:
    print("I'll do this everytime")

('caught unknown error: ', ArithmeticError())
I'll do this everytime

或者你可以做到

import sys
try:
    raise ArithmeticError
except:
    print("caught unknown error: ", sys.exc_info()[0])
finally:
    print("I'll do this everytime")

('caught unknown error: ', <type 'exceptions.ArithmeticError'>)
I'll do this everytime

另外,try除了block之外还可以有else语句。

想象一下,在某种情况下,您希望从raise语句中运行一些额外的代码appart。想象一下,代码也会抛出错误。把那些代码放在同一个try块中会破坏我的第一点,那不是我们应该做的事情!到目前为止,用我所展示的内容来解决这个问题:

executed = True
try:
    [do something]
except ValueError:
    executed = False
    print("caught valueerror")
finally:
    print("I'll do this everytime")
    if executed:
        [do something more]

我相信你会同意它的丑陋和可读性低于python通常所追求的目标。这就是为什么除了阻止之外你还可以在try中添加其他声明的原因。

else语句必须遵循所有例外情况,并且只有在没有引发错误的情况下才会执行。要真正技术化,它只会执行&#34;如果它从try语句流出&#34;。这意味着必须没有返回,中断,继续以及导致“跳跃”的声明。否则也会使你的代码更整洁,更强大,但我很少使用它或看到它被使用过:

try:
    [do something]
    pass
except ValueError:
    print("caught valueerror")
except RuntimeError:
    print("caught runtimeerror")
else:
    [do something more but only if there were no exceptions so far]
    print("I found no errors and executed else statement")
    raise ArithmeticError
finally:
    print("I'll do this everytime")

I found no errors and executed else statement
I'll do this everytime

Traceback (most recent call last):
  File "<pyshell#41>", line 7, in <module>
    raise ArithmeticError
ArithmeticError