Python中的ption
异常处理
在项⽬开发中,异常处理是不可或缺的。异常处理帮助⼈们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)
except TypeError:
print("TypeError")
except:
print("Not Type Error & Error noted")
由于a没有定义,所以是NameError。异常最终被except:部分的程序捕捉。
如果⽆法将异常交给合适的对象,异常将继续向上层抛出,直到被捕捉或者造成主程序报错。⽐如下⾯的程序
def test_func():
try:
m = 1/0
except NameError:
print("Catch NameError in the sub-function")
try:
test_func()
except ZeroDivisionError:
print("Catch error in the main program")
⼦程序的pt...结构⽆法处理相应的除以0的错误,所以错误被抛给上层的主程序。
如果try中没有异常,那么except部分将跳过,执⾏else中的语句。
finally是⽆论是否有异常,最后都要做的⼀些事情。
流程如下,
try->异常->except->finally
try->⽆异常->else->finally
抛出异常
我们也可以⾃⼰写⼀个抛出异常的例⼦:
print'Lalala'
raise StopIteration
print'Hahaha'
这个例⼦不具备任何实际意义。只是为了说明raise语句的作⽤。
StopIteration是⼀个类。抛出异常时,会⾃动有⼀个中间环节,就是⽣成StopIteration的⼀个对象。Python实际上抛出的,是这个对象。当然,也可以⾃⾏⽣成对象:
raise StopIteration()
总结
try: ... except exception: ... else: ... finally: ...
raise exception
⼀些常⽤的异常
exception EOFError
Raised when one of the built-in functions ( or )hits an end-of-file condition (EOF) without reading any data. (N.B.: the and methods return an empty stringwhen they hit EOF.)
exception IOError
Raised when an I/O operation (such as a statement, the built-in function or a method of a file object) fails for an I/O-relatedreason, e.g., “file not found” or “disk full”.
This class is derived from . See the discussion abovefor more information on exception instance attributes.
Changed in version 2.6: Changed to use this as a base class.
Exception hierarchy
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
syntaxerror是什么错误+-- Exception
+-- StopIteration
+-- StandardError
|    +-- BufferError
|    +-- ArithmeticError
|    |    +-- FloatingPointError
|    |    +-- OverflowError
|    |    +-- ZeroDivisionError
|    +-- AssertionError
|    +-- AttributeError
|    +-- EnvironmentError
|    |    +-- IOError
|    |    +-- OSError
|    |        +-- WindowsError (Windows)
|    |        +-- VMSError (VMS)
|    +-- EOFError
|    +-- ImportError
|    +-- LookupError
|    |    +-- IndexError
|    |    +-- KeyError
|    +-- MemoryError
|    +-- NameError
|    |    +-- UnboundLocalError
|    +-- ReferenceError
|    +-- RuntimeError
|    |    +-- NotImplementedError
|    +-- SyntaxError
|    |    +-- IndentationError
|    |        +-- TabError
|    +-- SystemError
|    +-- TypeError
|    +-- ValueError
|        +-- UnicodeError
|              +-- UnicodeDecodeError
|              +-- UnicodeEncodeError
|              +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning