Python 有两种错误很容易辨认:语法错误和异常。
Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。
关键字:1、assert raise ; 2、try except else finally
例子:
while True print('hello world')
执行结果:
File "D:/错误和异常.py", line 11
while True print('hello world')
^
SyntaxError: invalid syntax
在上面的语句中,函数print()被检查到有语法错误,原因是它print()前面缺了一个冒号:,同时语法分析器指出了出错的地方的行数,并且在最先找到的错误的位置标记了一个小小的箭头。
有时候Python程序的语法是正确的,在运行的时候也有可能发生错误,这种错误被称为异常。
大多数的异常都不会被程序处理,都以错误信息的形式展现出来。
a = 10 / 0 # 0 不能作为除数,触发异常: ZeroDivisionError: division by zero
b =1 + x * 2 # x 未定义,触发异常:NameError: name 'x' is not defined
c= '1' + 1 # 整型int和字符串str 不能相加,触发异常: TypeError: must be str, not int
异常以不同的类型出现,这些类型都作为信息的一部分打印出来,上面中的异常类型有: ZeroDivisionError、NameError 和 TypeError。错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息。
try:
代码块(可能出现错误的语句)
except 异常类型 as 异常名:
代码块(出现错误以后的处理方式)
except 异常类型 as 异常名:
代码块(出现错误以后的处理方式)
except 异常类型 as 异常名:
代码块(出现错误以后的处理方式)
...
else:
代码块(没出错时要执行的语句)
finally:
代码块(是否出错该代码块都会执行)
while True:
try:
x = int(input("请输入一个数字: "))
break
except ValueError:
print("您输入的不是数字,请再次尝试输入!")
使用快捷键Ctrl+c或者操作系统提供的方法可以中断该程序,并引发一个KeyboardInterrupt异常,执行结果:
请输入一个数字: ds
您输入的不是数字,请再次尝试输入!
请输入一个数字: sdfd
您输入的不是数字,请再次尝试输入!
请输入一个数字:
Traceback (most recent call last):
File "" , line 3, in <module>
x = int(input("请输入一个数字: "))
KeyboardInterrupt
import sys
try:
f = open('myfile.txt') # open()函数用来打开文件myfile.txt
s = f.readline() # f.readline()用来读取f的第一行整行内容,包括 "\n" 字符。
i = int(s.strip()) # strip()方法用于移除字符串头尾指定的字符(默认为空格)或字符序列。
except OSError as err: # 如果myfile.txt文件没有创建,则会引发OSError异常
print("OS error: {0}".format(err))
except ValueError: # 如果s不是数字或者数字字符串,则int()转换失败,引发ValueError异常
print("Could not convert data to an integer.")
except: # 在except后面不加任何的内容,则表示获取所有的异常
print("Unexpected error:", sys.exc_info()[0])
raise
def division_error():
x=10/0
#直接调用
try:
division_error()
except ZeroDivisionError as zero_er:
print('error:',zero_er)
def fn():
division_error()
# 间接调用
try:
fn()
except ZeroDivisionError as zero_er:
print('error:',zero_er)
try:
print(a)
except NameError:
print(NameError)
else:
try:
with open('myfile.txt') as mf:
read_data = mf.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
finally:
print('无论异常是否发生,都会执行该代码。')
执行结果:
<class 'NameError'>
无论异常是否发生,都会执行该代码。
try:
raise NameError('aa')
except NameError:
print('一个异常被抛出')
raise
执行结果:
一个异常被抛出
Traceback (most recent call last):
File "D:/错误和异常.py", line 164, in <module>
raise NameError('aa')
NameError: aa
扩展:自定义异常
我们知道异常其实是一个类,而所有异常类的父类是Exception类,因此我们通过继承来创建一个属于自己的异常类。