语法错误
语法错误又称解析错误,是python学习中最常遇到的错误:
def fuc
^
SyntaxError: invalid syntax
解析器会输出出现语法错误的那一行,并显示一个“箭头”,指向这行里面检测到第一个错误。 (此例为函数缺少 ‘:’)
异常
常见的异常
异常 | 描述 |
---|---|
NameError | 尝试访问一个没有申明的变量 |
ZeroDivisionError | 除数为0 |
SyntasError | 语法错误 |
IndexError | 索引超出序列范围 |
KeyError | 请求一个不存在的字典关键字 |
IOError | 输入/输出错误 |
AttributeError | 尝试访问位置的对象属性 |
- NameError
#未对变量绑定对象直接使用.
n
NameError: name 'n' is not defined
- ZeroDivisionError
#零作分母
1/0
ZeroDivisionError: division by zero
- SyntaxError
#函数没有冒号
def fuc
^
SyntaxError: invalid syntax
- IOError
#打开不存在的文件
f = open("text")
FileNotFoundError: [Errno 2] No such file or directory: 'text'
- AttributeError
#使用未定义的属性
a.m
AttributeError: 'A' object has no attribute 'm'
处理异常
为了保证代码的健壮性,有时我们需要对一些由用户操作不当而引起的一些异常做处理。这就需要用到异常处理语句。
try…except…
对于try...except...
语句,如果try
子语句有异常发生,则直接跳到except部分。下面我们对于该语句的几种情况来:
- 不管什么异常,都执行except
#except后不跟任何异常类型
try:
1/0
except:
print("分母不能为零")
- 执行指定异常
# 产生的异常不是 except语句后跟的异常
try:
1/0
except IOError:
print("IOError错误")
# 运行结果
1/0
ZeroDivisionError: division by zero
#产生的异常是except语句后跟的异常
try:
1/0
except ZeroDivisionError:
print("ZeroDivisionError错误")
#运行结果
ZeroDivisionError错误
- 多个except
# 有多个except,try里面遇到一个异常,就转到相应的except子句
try:
a
except ZeroDivisionError:
print("ZeroDivisionError错误")
except NameError:
print("NameError错误")
# 运行结果
NameError错误
#当然这样也是可以的
try:
a
except (ZeroDivisionError,NameError):
print("ZeroDivisionError或NameError错误")
# 运行结果
ZeroDivisionError或NameError错误
- 打印默认错误提示
# 对于单个异常
try:
1/0
except ZeroDivisionError as error:
print(error)
#对于多个异常
try:
1/0
except (ZeroDivisionError,IOError) as error:
print(error)
#对于所有异常
try:
1/0
except Exception as error:
print(error)
#运行结果
division by zero
else子句
除了try...except...
句式以外,还有try...except...else...
,之行过程是如果try
子句能后正常运行,那么就执行else
子句。
try:
口/口
except Exception as error:
print(error)
else:
print("try子句成功运行")
# 1/0输出结果
division by zero
#2/1输出结果
try子句成功运行
下面给出一个关于else的例子,计算两数和
while True:
a=input("请输入A:")
b=input("请输入B:")
try:
c=int(a)/int(b)
except Exception as ex:
print("输入有误:",ex)
else:
print("结果为:",c)
break
#输出结果
请输入A:2
请输入B:0
输入有误: division by zero
请输入A:2
请输入B:1
结果为: 2.0
finally子句
有了finally
,不管前面执行的是try
,还是except
,最终都要之行它。因此我们可以利用finally
做一些收尾善后的工作。值得注意点是:**当try
和except
中有return
时,在执行到return
之前会跳转至finally
子句执行,直至执行完。
def func(a,b):
try:
a/b
print("try子句")
return 0
except:
print("except子句")
return 1
finally:
print("finally子句")
return 2
print(func(1,0))
print(func(1,1))
#运行结果
except子句
finally子句
2
try子句
finally子句
2
#若把finally中的return去掉,则输出为
except子句
finally子句
1
try子句
finally子句
0
assert语句
assert主要用来判断真假,如果为真则正常执行,如果为假则抛出异常。
assert True #正常执行
assert False #抛出异常
def func(a,b):
try:
assert a==b
print("两数相等")
except:
print("两数不等")
func(1,0)
func(1,1)
#输出结果
两数不等
两数相等