有过JAVA语言的学习经验都知道程序即使没有语法错误,但是运行过程中还是会有些“毛病”,这些毛病我们称其为异常。
捕获异常
基本语法规则:
try:
#可能会产生异常的语句块
except 异常类型:
#捕获异常后的处理
示例代码:
try:
a=1/0
print("异常产生之后的代码")
except ZeroDivisionError:
print("发生异常后的处理")
print("最后的处理")
异常处理流程:
首先执行try和except之间的代码块,如果没有异常产生,except中的语句块不执行;如果产生异常,在异常产生处之后的代码不再执行。如果异常的类型和except的名称相符,则执行对应的except子句的代码。最后执行try except 语句之后的代码 。
一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。但是只有一个except子句会被执行。同时,一个except中可以有多个异常类型,用元组存放这些异常类型。并且我们可以使用as为异常类型取别名。和JAVA中的异常处理一样,python中也有finally子句,不管发生异常与否,finally子句的代码一定会执行。
try:
#可能会产生异常的语句块
except 异常1 as 别名:
#捕获异常1后的处理
except (异常2,异常3,异常4……异常n):
#捕获异常后的处理
except:#可以不用写具体异常类型,作为通配符使用
#捕获到上面之外的其他异常
finally:
#最后一定会执行的代码,即使发生异常
测试示例:
def fun():
try:
a=1/0
except ZeroDivisionError:
print("发生异常后的处理")
return 2
finally:
print("finally")
return 4
print(fun())
即使在except中return 2,但是finally是一定会最后执行的,所有fun()的返回值为4。
try except 语句还有一个else子句。不过else子句必须放在所有的except语句后面。并且只有没有发生异常时else中的代码块才会执行。
try:
#可能会产生异常的语句块
except 异常1:
#捕获异常后的处理
else:
#没有任何异常时的处理
抛出异常
Python 使用 raise 语句抛出一个指定的异常。
语法规则:
try:
#可能会产生异常的语句块
except 异常1:
#捕获异常后的处理
except:
#捕获到未知的异常,将它抛出
raise
用户自定义异常
除了使用系统自带的异常类型,我们也可以定义自己的异常类型。异常类继承自 Exception 类。
class MyError(Exception):
pass
class MyError2(MyError):
pass
当创建一个模块有可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类:
class Error(Exception):
"""Base class for exceptions in this module."""
pass
class InputError(Error):
"""Exception raised for errors in the input.
Attributes:
expression -- input expression in which the error occurred
message -- explanation of the error
"""
def __init__(self, expression, message):
self.expression = expression
self.message = message
class TransitionError(Error):
"""Raised when an operation attempts a state transition that's not
allowed.
Attributes:
previous -- state at beginning of transition
next -- attempted new state
message -- explanation of why the specific transition is not allowed
"""
def __init__(self, previous, next, message):
self.previous = previous
self.next = next
self.message = message
(来源:http://www.runoob.com/python3/python3-errors-execptions.html)