前言:前一段时间,在给别人写Python课设和毕设的时候,由于业务逻辑的需要,或者本身代码逻辑的不完整行,进行在测试的时候python解释器会抛出各种异常,因此这里整理了一下python的异常捕获机制,给自己做个简单的总结。
其实说白了,捕获异常就是为了产品的稳定性和健壮性
try:
pass # 要尝试执行的代码
except:
pass # 出现错误的处理
try:
# 提示用户输入一个整数
num = int(input('请输入一个整数:'))
result = 10 / num
print(result)
except:
print('请输入正确的数字')
我们来测试一下:
请输入一个整数:10
1.0
Process finished with exit code 0
加入我们输入一个字符:
请输入一个整数:a
请输入正确数字
显而易见,这个机制很强大。
try:
# 尝试执行的代码
pass
except 错误类型1:
# 针对错误类型1,对应的代码处理
pass
except (错误类型2, 错误类型3):
# 针对错误类型2 和 3,对应的代码处理
pass
except Exception as result:
print("未知错误 %s" % result)
num = int(input('请输入一个整数:'))
print(num)
我们输入一个字符运行以下:
请输入一个整数:a
Traceback (most recent call last):
File "你的python文件路径和名称", line (这里是在第几行报错), in <module>
num = int(input('请输入一个整数:'))
ValueError: invalid literal for int() with base 10: 'a'
这个里的错误信息第一个单词是ValueError,这就是错误类型。
捕获错误类型
try:
# 提示用户输入一个整数
num = int(input('请输入一个整数:'))
result = 10 / num
print(result)
except ZeroDivisionError:
print('除0错误')
except ValueError:
print('请输入一个正常整数')
捕获未知错误
except Exception as e:
print("未知错误 %s" % e)
我们这里简单看一下这个Exception类:
class Exception(BaseException):
""" Common base class for all non-exit exceptions. """
def __init__(self, *args, **kwargs): # real signature unknown
pass
@staticmethod # known case of __new__
def __new__(*args, **kwargs): # real signature unknown
""" Create and return a new object. See help(type) for accurate signature. """
pass
继承自BaseException类,初始化的时候可以传入元组和关键字参数,然后就是跟着一个静态方法,类结构清晰明了。
try:
# 尝试执行的代码
pass
except 错误类型1:
# 针对错误类型1,对应的代码处理
pass
except 错误类型2:
# 针对错误类型2,对应的代码处理
pass
except (错误类型3, 错误类型4):
# 针对错误类型3 和 4,对应的代码处理
pass
except Exception as result:
# 打印错误信息
print(result)
else:
# 没有异常才会执行的代码
pass
finally:
# 无论是否有异常,都会执行的代码
print("无论是否有异常,都会执行的代码")
try:
# 提示用户输入一个整数
num = int(input('请输入一个整数:'))
result = 10 / num
print(result)
except ValueError:
print('请输入一个正常整数')
except Exception as e:
print('未知整数 %s' % e)
else:
print('尝试成功')
finally:
print('无论是否出现错误都会执行')
提示:
- 在开发中,可以在主函数中增加 异常捕获
- 而在主函数中调用的其他函数,只要出现异常,都会传递到主函数的 异常捕获 中。这样就不需要在代码中,增加大量的 异常捕获,能够保证代码的整洁
案例2
def fun1():
return int(input('请输入一个整数:'))
def fun2():
return fun1()
try:
print(fun2())
except Exception as e:
print(e)
finally:
print('程序终止')
需求
def input_password():
pwd = input('请输入密码:')
# 如果 < 8 主动抛出异常
if len(pwd) >= 8:
return pwd
print('主动抛出异常')
# 创建异常对象 可以使用错误信息字符串作为参数
# 还记得Exception的__init__(self, self, *args, **kwargs)吗?
ex = Exception("密码长度不够, 需要重新输入")
raise ex
try:
print(input_password())
except Exception as e:
print(e)
到此结束,记录一下时间吧:
In [1]: from datetime import datetime
In [2]: print(datetime.now())
2020-02-15 14:07:56.561248
In [3]: