pythontrycatch所有异常状态_python⼀篇搞定所有的异常处理异常处理
在项⽬开发中,异常处理是不可或缺的。异常处理帮助⼈们debug,通过更加丰富的信息,让⼈们更容易到bug的所在。异常处理还可以提⾼程序的容错性。
我们之前在讲循环对象的时候,曾提到⼀个StopIteration的异常,该异常是在循环对象穷尽所有元素时的报错。
我们以它为例,来说明基本的异常处理。
⼀个包含异常的程序:
re= iter(range(5))for i in range(100):()print 'HaHaHaHa'⾸先,我们定义了⼀个循环对象re,该循环对象将进⾏5次循环,每次使⽤序列的⼀个元素。
在随后的for循环中,我们⼿⼯调⽤next()函数。当循环进⾏到第6次的时候,re.next()不会再返回元素,⽽是抛出(raise)StopIteration的异常。整个程序将会中断。
我们可以修改以上异常程序,直到完美的没有bug。但另⼀⽅⾯,如果我们在写程序的时候,知道这⾥可能犯错以及可能的犯错类型,我们可以针对该异常类型定义好”应急预案“。
re= iter(range(5))try:for i in range(100):()exceptStopIteration:print 'here is end',iprint 'HaHaHaHa'在try程序段中,我们放⼊容易犯错的部分。我们可以跟上except,来说明如果在try部分的语句发⽣StopIteration时,程序该做的事情。如果没有发⽣异常,则except部分被跳过。
随后,程序将继续运⾏,⽽不是彻底中断。
完整的语法结构如下:try:
...exceptexception1:
...exceptexception2:
...except:
...else:
...finally:
...
如果try中有异常发⽣时,将执⾏异常的归属,执⾏except。异常层层⽐较,看是否是exception1, exce
<,直到到其归属,执⾏相应的except中的语句。如果except后⾯没有任何参数,那么表⽰所有的exception都交给这段程序处理。⽐
如:try:print(a*2)exceptTypeError:print("TypeError")except:print("Not Type Error & Error noted")
由于a没有定义,所以是NameError。异常最终被except:部分的程序捕捉。
如果⽆法将异常交给合适的对象,异常将继续向上层抛出,直到被捕捉或者造成主程序报错。⽐如下⾯的程序deftest_func():try:
m= 1/0exceptNameError:print("Catch NameError in the sub-function")try:
test_func()exceptZeroDivisionError:print("Catch error in the main program")
⼦程序的pt...结构⽆法处理相应的除以0的错误,所以错误被抛给上层的主程序。
如果try中没有异常,那么except部分将跳过,执⾏else中的语句。
finally是⽆论是否有异常,最后都要做的⼀些事情。
流程如下,try->异常->except->finally
try->⽆异常->else->finally抛出异常
我们也可以⾃⼰写⼀个抛出异常的例⼦:print 'Lalala'
raiseStopIterationprint 'Hahaha'这个例⼦不具备任何实际意义。只是为了说明raise语句的作⽤。
StopIteration是⼀个类。抛出异常时,会⾃动有⼀个中间环节,就是⽣成StopIteration的⼀个对象。Python实际上抛出的,是这个对象。当然,也可以⾃⾏⽣成对象:raiseStopIteration()
总结try: ... except exception: ... else: ... finally: ...raise exception
这个⽤于当异常出现的时候,⽤except从句来处理异常,⽽不⾄于程序⾃动退出。例如,在python⾥获取⽤户输⼊时,若⽤户输⼊⽂件结束符Ctrl-d,则会引发EOFError⽂件结束异常。我们使⽤try except来处理:
#!/usr/bin/python
# Filename: try_except.py
import sys
try:
s = raw_input('Enter something --> ')
except EOFError:
print '\nWhy did you do an EOF on me?'
except:
print '\nSome error/exception occurred.'
# here, we are not exiting the program
print 'Done' 123456789101112131415
我们在运⾏程序的时候输⼊Ctrl-d:
$ python try_except.py
Enter something -->
Why did you do an EOF on me?
$ python try_except.py
Enter something --> Python is exceptional!
Done1234567
可以看到,当遇到EOFERROR时,程序执⾏了except EOFError:中的内容。若出现其他异常,则会执⾏except:从句中的内容。except后⾯还可以加else从句,如果没有发⽣异常,则执⾏else从句中的内容。记住,⾸先,我们要导⼊sys模块!!
try.. catch
catch主要⽤于异常出现的时候抓取异常,⽅便显⽰异常信息。但是我还没有见别⼈⽤过,不到例⼦~所以是不推荐⽤嘛?谁到例⼦可以留⾔给我^.^
try.. finally
假如你在读⼀个⽂件的时候,希望在⽆论异常发⽣与否的情况下都关闭⽂件,该怎么做呢?这可以使⽤finally块来完成。注意,在⼀个try 块下,你可以同时使⽤except从句和finally块。如果你要同时使⽤它们的话,需要把⼀个嵌⼊另外⼀个。举个例⼦(还记得⽂件读写⾥的poem嘛):
#!/usr/bin/python
# Filename: finally.py
import time
try:
f = file('')
while True: # our usual file-reading idiom
line = f.readline()
if len(line) == 0:
break
time.sleep(2)
print line,
finally:
f.close()
print 'losed the file' 12345678910111213141516
输出:
$ python finally.py
Programming is fun
When the work is done
losed the file
Traceback (most recent call last):
File "finally.py", line 12, in ?
time.sleep(2)
KeyboardInterrupt 12345678
我们进⾏通常的读⽂件⼯作,但是我有意在每打印⼀⾏之前⽤time.sleep⽅法暂停2秒钟。这样做的原因是让程序运⾏得慢⼀些(Python由于其本质通常运⾏得很快)。在程序运⾏的时候,按Ctrl-c中断/取消程序。
我们可以观察到KeyboardInterrupt异常被触发,程序退出。但是在程序退出之前,finally从句仍然被执⾏,把⽂件关闭
⽤raise引发异常
我们可以使⽤raise语句 引发 异常,但要指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是⼀个Error或Exception类的直接或间接⼦类。举个例⼦:
#!/usr/bin/python
# Filename: raising.py
class ShortInputException(Exception):
'''A user-defined exception class.'''
def __init__(self, length, atleast):
Exception.__init__(self)
self.length = length
self.atleast = atleast
try:
s = raw_input('Enter something --> ')
if len(s) < 3:
raise ShortInputException(len(s), 3)
# Other work can continue as usual here
except EOFError:
print '\nWhy did you do an EOF on me?'
except ShortInputException, x:
print 'ShortInputException: The input was of length %d, \
was expecting at least %d' % (x.length, x.atleast)
else:
print 'No exception was raised.' 12345678910111213141516171819202122
输出:
python的try和except用法$ python raising.py
Enter something -->
Why did you do an EOF on me?
$ python raising.py
Enter something --> ab
ShortInputException: The input was of length 2, was expecting at least 3
$ python raising.py
Enter something --> abc
No exception was raised. 1234567891011
这⾥,我们创建了我们⾃⼰的异常类型,其实我们可以使⽤任何预定义的异常/错误。⾃⼰定义的异常类型是ShortInputException类。它有两个域——length是给定输⼊的长度,atleast则是程序期望的最⼩长度。
在except从句中,我们提供了错误类和⽤来表⽰错误/异常对象的变量。这与函数调⽤中的形参和实参概念类似。当触发raise从句时,会调⽤对应的except从句执⾏,在这个例⼦中就引发了except ShortInputException,x 这个错误,类似于调⽤。
---------------------
异常处理
在项⽬开发中,异常处理是不可或缺的。异常处理帮助⼈们debug,通过更加丰富的信息,让⼈们更容易到bug的所在。异常处理还可以提⾼程序的容错性。
我们之前在讲循环对象的时候,曾提到⼀个StopIteration的异常,该异常是在循环对象穷尽所有元素时的报错。
我们以它为例,来说明基本的异常处理。
⼀个包含异常的程序:
re = iter(range(5))
for i in range(100):
()
print 'HaHaHaHa'
⾸先,我们定义了⼀个循环对象re,该循环对象将进⾏5次循环,每次使⽤序列的⼀个元素。
在随后的for循环中,我们⼿⼯调⽤next()函数。当循环进⾏到第6次的时候,re.next()不会再返回元素,⽽是抛出(raise)StopIteration的异常。整个程序将会中断。
我们可以修改以上异常程序,直到完美的没有bug。但另⼀⽅⾯,如果我们在写程序的时候,知道这⾥可能犯错以及可能的犯错类型,我们可以针对该异常类型定义好”应急预案“。
re = iter(range(5))
try:
for i in range(100):
()
except StopIteration:
print 'here is end ',i
print 'HaHaHaHa'
在try程序段中,我们放⼊容易犯错的部分。我们可以跟上except,来说明如果在try部分的语句发⽣StopIteration时,程序该做的事情。如果没有发⽣异常,则except部分被跳过。
随后,程序将继续运⾏,⽽不是彻底中断。
完整的语法结构如下:
try:
...
except exception1:
...
except exception2:
...
except:
...
else:
...
finally:
...
如果try中有异常发⽣时,将执⾏异常的归属,执⾏except。异常层层⽐较,看是否是exception1, ,直到到其归属,执⾏相应的except中的语句。如果except后⾯没有任何参数,那么表⽰所有的exception都交给这段程序处理。⽐如:
try:
print(a*2)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论