引言
在前面的学习中,我们碰见到了许多报错信息,这一篇将会介绍这些错误
语法错误
当我们执行程序时,发现报错信息是"SyntaxError"开头的,就说明这是一个语法错误,同时编译器会将错误出现的哪个文件、几行和第几个字符开始出错的标明清楚,此时我们只需要进行查找和修改就行
异常
即使Python的语法是正确的,但是运行时也会出现一些预想之外的错误,运行时检测到的错误为异常,有些错误可能不是致命的但如果程序对大多数异常都不作处理,编译器会将错误输出到屏幕上并终止程序,此时编译器将投出"Traceback"用来提示出现了异常,并在其后表明是哪种错误,不同的异常会有不同的异常名称输出
常见的问题有以下
除零错误"ZeroDivisionError"
变量未定义错误"NameError"
str类型与int类型串联错误"TypeError"
字典类型中无相关键错误"KeyError"
索引超出范围错误"IndexError"
当然还有许多的异常类型,可以自行查阅官方文档
异常处理
有时异常的出现是不可预料的,出现异常时程序会中止,即使这个异常并不影响整合程序或是后续的程序,我们此时就需要将异常进行处理使程序继续进行下去,不至于使整个程序终止,下面我们将讲述一个例子方便理解
while True:
number = int(input("请输入一个数字"))
这个例子将会让用户不断的输入内容(按下Ctrl+C的组合键可以停止该程序),用户输入数字时程序将会不断地进行下去,但当用户输入非数字时,例如"abc"时程序将会输出错误并且退出,可是在实际体验中我们不可能遇见用户的输入到底是什么,例如我们在某手机APP中输入了某些违规输入此时APP自动退出,这肯定并不是什么良好的体验,我们需要处理这些异常,确保程序不会因为这些异常退出
while True:
try:
number = int(input("请输入一个数字"))
except ValueError:
print("您输入的恐怕不是一个有效的数字,请重新输入")
此时当我们的try方法中的输入抛出ValueError问题时,就会执行except ValueError:中的语句
在这里我们使用了两个新的关键字:try和except,这两个关键字用于捕获异常并让我们运行相应的代码去处理异常,语法如下
try:
业务语法块
except 异常类型:
处理异常语法块
在try业务语法块中,产生的任何异常都会终止业务语法块并跳转到except匹配异常类型,如果匹配的上就运行处理异常的语法块,否则程序就报错退出
while True:
try:
number = int(input("请输入一个数字"))
except KeyError:
print("KeyError")
except ValueError:
print("ValueError")
except KeyboardInterrupt:
print("用户终止,退出程序") # Ctrl+C会抛出此种异常
exit()
except Exception as e:
print("未知错误",e)
由于大部分的异常都是继承自Exception这个父类,所以匹配的异常是Exception就总是可以匹配到大多的异常
抛出异常
前面所学的都是系统抛出的异常,当然我们也可以进行手动抛出异常,可以使用raise语句手动的抛出一个指定的异常
raise Exception
这个例子输出了一个没有任何内容的异常,错误信息是空的,我们也可以指定输出一个有错误的内容异常
raise Exception("这是错误信息")
这个例子在抛出异常时会带有错误提示信息,在手动抛出异常时我们可以使用这种方法来提示用户,程序出错在了哪里
finally语句
finally语句需要和try语句一起使用,它的作用是无论是否有异常或是否捕获了异常,finally语句都会保证执行
try:
print(1/0)
except ZeroDivisionError:
print("除零异常")
finally:
print("finally子句")
执行结果如下
除零错误
finally子句
这个特性在以后数据库和文件处理中相当有用,因为无论是数据库还是文件处理,在做了一些操作之后都需要进行一些必要的善后工作
自定义异常
自定义异常应继承自Exception类,可以直接继承也可以间接继承,当我们使用raise抛出自定义异常时系统会接收到这个异常并输出我们预定好的错误信息,当然我们也可以使用except捕获这个自定义异常
class MyException(Exception):
def __init__(self):
pass
def __str__(self):
return "这是个自定义的异常"
def raise_customer_exception():
raise MyException()
try:
raise_customer_exception()
except MyException as e:
print("Error",e)
执行结果如下
Error 这是个自定义的异常