常见错误
NameError--使用未定义的变量
SyntaxError--语法错误,常见程序格式不对。如if a后没有:
IOError--打开一个不存在的文件或文件
ZeroDivisionError--除零错误,即分母为零
ValueError--传入值无效,强制类型转换时产生。如a=int('dd')
KeyboardInterrupt--键盘中断错误,强制终止程序时产生。
错误
语法错误:代码不符合解释器或者编译器语法
逻辑错误:不完整或者不合法输入或者计算出现问题
异常
程序遇到逻辑或者算法问题
运行过程中计算机错误(内存不够或IO错误)
如果没有手动对异常进行处理,那么该异常就会被解释器捕获并处理,处理的方法为忽略或终止程序
区别
错误是非正常的,是根本不应该出现的,比如缩进字符
异常是一种程序运行条件,而非严重错误,比如用户输入过大
异常处理
try/except
异常捕捉可以使用 try/except 语句。
实例:
while True: try:
x = int(input("请输入一个数字: "))
break
except ValueError:
print("您输入的不是数字,请再次尝试输入!")
#让用户输入一个合法的整数,但是允许用户中断这个程序(使用 Control-C 或者操作系统提供的方法)。用户中断的信息会引发一个 KeyboardInterrupt 异常。
try/except...else
try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。
else 子句将在 try 子句没有发生任何异常的时候执行。
实例:
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except IOError:
print('cannot open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
# try 语句中判断文件是否可以打开,如果打开文件时正常的没有发生异常则执行 else 部分的语句,读取文件内容
try-finally 语句
try-finally 语句无论是否发生异常都将执行最后的代码。
实例:
try:
runoob()
except AssertionError as error:
print(error)
else:
try:
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
finally:
print('这句话,无论异常是否发生都会执行。')
#finally 语句无论异常是否发生都会执行:
抛出异常
Python 使用 raise 语句抛出一个指定的异常。
实例:
x = 10
if x > 5:
raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
#如果 x 大于 5 就触发异常:
用户自定义异常
你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,
实例:
class MyError(Exception): def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
try:
raise MyError(2*2)
except MyError as e:
print('My exception occurred, value:', e.value)
raise MyError('oops!')
输出结果:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'