Python目前(至少)有两种可区分的错误:语法错误和异常。异常是指在语法正确的情况下执行时引发的错误。有时候我们需要处理这些异常,就会用到try-except语句。
while True:
try:
x = int(input("请输入一个整数: "))
y = 12 / x
print("被12除得到的结果:{}".format(y))
break
except ValueError: #ValueError: invalid literal for int() with base 10: 'art'
print("无效的数字,请重试!")
except ZeroDivisionError as err: #ZeroDivisionError: division by zero
print('除数不能为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
子句,在使用时必须放在所有的 except
子句后面。用来编写在 try
子句不引发异常时必须执行的代码。
while True:
try:
x = int(input("请输入一个整数: "))
y = 12 / x
print("被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
语句有另一个可选子句,用于定义必须在所有情况下执行的清理操作。
如果在执行 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 / y
except 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
divide("2","1")
File "D:/code/exercise/blog/error.py", line 28, in divide
result = x / y
执行finally语句!
TypeError: unsupported operand type(s) for /: 'str' and 'str'
raise
语句允许程序员强制发生指定的异常。用于主动抛出异常。
raise
唯一的参数就是要抛出的异常。这个参数必须是一个异常实例或者是一个异常类(派生自 Exception 的类)。
raise NameError("这是一个NameError!")
执行:
Traceback (most recent call last):
File "D:/code/exercise/blog/error.py", line 42, in
raise NameError("这是一个NameError!")
NameError: 这是一个NameError!
可以通过创建新的异常类来自定义异常。异常通常应该继承Exception
类。
下面是一个selenium
封装定位方法中的例子:
class LocatorTypeError(Exception):
# 定位元素输入类型错误的异常
pass
def 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_id
def 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
query_user("sdsadasds")
File "D:/code/exercise/blog/error.py", line 45, in query_user
raise IdError("id{}输入错误,用户id必须是整型".format(IdError(id).args))
__main__.IdError: id('sdsadasds',)输入错误,用户id必须是整型
python内置异常类型查阅