Python目前(至少)有两种可区分的错误:语法错误和异常。异常是指在语法正确的情况下执行时引发的错误。有时候我们需要处理这些异常,就会用到try-except语句。
try-except
while True:try:x = int(input("请输入一个整数: "))y = 12 / xprint("被12除得到的结果:{}".format(y))breakexcept ValueError: #ValueError: invalid literal for int() with base 10: 'art'print("无效的数字,请重试!")except ZeroDivisionError as err: #ZeroDivisionError: division by zeroprint('除数不能为0:', err)
当出现ValueError
的异常时:
请输入一个整数: art无效的数字,请重试!请输入一个整数: 12被12除得到的结果:1.0
当出现ZeroDivisionError
的异常时
请输入一个整数: 0除数不能为0: division by zero请输入一个整数: 12被12除得到的结果:1.0
一个 except 子句可以将多个异常命名为带括号的元组
except (ValueError, ZeroDivisionError):pass
try-except-else
try ... except
语句有一个可选的else
子句,在使用时必须放在所有的except
子句后面。用来编写在try
子句不引发异常时必须执行的代码。
while True:try:x = int(input("请输入一个整数: "))y = 12 / xprint("被12除得到的结果:{}".format(y))#break #这个break和下面的else语句有冲突,有break下面的else语句就会执行不到except ValueError:print("无效的数字,请重试!")except ZeroDivisionError as err:print('除数不能为0:', err)#try语句中的代码不报错时执行下面的else:print("输入的整数是:{0},计算得到的结果是:{1}".format(x,y))break
程序运行如下:
请输入一个整数: 12被12除得到的结果:1.0输入的整数是:12,计算得到的结果是:1.0
try-except-else-finally
try
语句有另一个可选子句,用于定义必须在所有情况下执行的清理操作。
如果在执行 try 子句期间发生了异常,该异常可由一个 except 子句进行处理。 如果异常没有被某个 except 子句所处理,则该异常会在 finally 子句执行之后被重新引发。
异常也可能在 except 或 else 子句执行期间发生。 同样地,该异常会在 finally 子句执行之后被重新引发。
如果在执行 try 语句时遇到一个 break, continue 或 return 语句,则 finally 子句将在执行 break, continue 或 return 语句之前被执行。
如果 finally 子句中包含一个 return 语句,则返回值将来自 finally 子句的某个 return 语句的返回值,而非来自 try 子句的 return 语句的返回值。
官方文档中的例子:
def divide(x, y):try:result = x / yexcept ZeroDivisionError:print("除数不能为0!")else:print("计算结果为:", result)finally:print("执行finally语句!")
参数正确:
divide(2,1)
计算结果为: 2.0执行finally语句!
除数参数输入0:
divide(2,0)
除数不能为0!执行finally语句!
参数不为整数:
divide("2","1")
Traceback (most recent call last):File "D:/code/exercise/blog/error.py", line 36, in <module>divide("2","1")File "D:/code/exercise/blog/error.py", line 28, in divideresult = x / y执行finally语句!TypeError: unsupported operand type(s) for /: 'str' and 'str'
raise
raise
语句允许程序员强制发生指定的异常。用于主动抛出异常。
raise
唯一的参数就是要抛出的异常。这个参数必须是一个异常实例或者是一个异常类(派生自 Exception 的类)。
raise NameError("这是一个NameError!")
执行:
Traceback (most recent call last):File "D:/code/exercise/blog/error.py", line 42, in <module>raise NameError("这是一个NameError!")NameError: 这是一个NameError!
用户自定义的异常
可以通过创建新的异常类来自定义异常。异常通常应该继承Exception
类。
下面是一个selenium
封装定位方法中的例子:
class LocatorTypeError(Exception):# 定位元素输入类型错误的异常passdef find(locator):if not isinstance(locator, tuple):raise LocatorTypeError("参数类型错误,locator必须是元组类型,loc = ('id','value1')")
定义的异常类,通常保持简单,可以提供一些属性,为异常提取有关错误的信息。
class IdError(Exception):#输入id错误的异常def __init__(self, input_id):self.input_id = input_iddef query_user(id):if not isinstance(id,int):raise IdError("id{}输入错误,用户id必须是整型".format(IdError(id).args))query_user("sdsadasds")
执行:
Traceback (most recent call last):File "D:/code/exercise/blog/error.py", line 47, in <module>query_user("sdsadasds")File "D:/code/exercise/blog/error.py", line 45, in query_userraise IdError("id{}输入错误,用户id必须是整型".format(IdError(id).args))__main__.IdError: id('sdsadasds',)输入错误,用户id必须是整型
python内置异常类型查阅