作为 Python 初学者,在学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍。
Python 有两种错误很容易辨认:语法错误和异常。
1. 语法错误
Python 的语法错误或者称之为解析错,一般以 Synatax Error 开头
print while True:
^
# SyntaxError: Missing parentheses in call to 'print'. Did you mean print(while True:)
2. 异常
运行时检测到的错误被称为异常,有些错误可能不是致命的,但如果程序对大多数异常都不做处理,Python解释器会输出异常信息到屏幕上并终止程序
# 错误: ZeroDivisionError: division by zero
print(1/0)
其他常见异常
# TypeError: can only concatenate str (not "int") to str
"1" + 0
# KeyError: 'world'
d = {}
d["world"]
# IndexError: list index out of range
l = [1,2,3,4]
l[20]
3. 处理异常
有如下程序
while True:
number = int(input("请输入一个数字:"))
如果输入的是数字,可以正常运行;但如果输入的不是数字,会出现错误: ValueError: invalid literal for int() with base 10: ‘a’
3.1 使用try…except处理异常
while True:
try:
number = int(input("请输入一个数字:"))
except ValueError:
print("您输入的恐怕不是一个有效数字!请重试!")
3.2 except接收多种异常
while True:
try:
number = int(input("请输入一个数字:"))
if number > 20:
break
except KeyError:
print("KeyError")
except ValueError:
print("ValueError")
except KeyboardInterrupt:
print("用户终止,退出程序")
exit()
except Exception as e:
print("未知错误", e)
4. 抛出异常
在Python中可以抛出异常,使用 raise 关键字
raise Exception
raise Exception("这是错误信息")
5. finally子句
Python 的finally需要和try一起使用,finally子句在异常中的作用是:无论是否异常或捕获了异常,finally子句都会保证执行
5.1 except捕获异常
try:
print(1/0)
except ZeroDivisionError:
print("除零错误")
finally:
print("finally子句")
# 除零错误
# finally子句
5.2 except无法捕获异常
try:
print(1/0)
except ValueError:
print("除零错误")
finally:
print("finally子句")
# finally子句
6. 自定义异常
自定义异常直接或间接继承自 Exception 类
6.1 抛出自定义异常
class MyException(Exception):
def __init__(self):
pass
def __str__(self):
return "这是一个自定义异常"
def raise_customer_exception():
raise MyException()
6.2 捕获自定义异常
try:
raise_customer_exception()
except MyException as e:
print("Error!", e)
# Error! 这是一个自定义异常