文章目录
一 错误和异常
1. 什么是错误
被编程玩的朋友应该再熟悉不过编程中出现的错误了,那到底什么是错误呢?看了一些文章,觉得下面的描述比较nice。首先,错误分为两种,如下
- 语法错误:即编写的代码不符合解释器或者编译器的语法,如python中的缩进不规范,冒号缺失,拼写错误等。
#缩进错误
for i in range(10):
print(i)
#冒号缺失错误
for i in range(10)
print(i)
- 逻辑错误:不完整,不合法输入,计算错误等。
#逻辑错误
re = 3 / 0
print(re)
2. 什么是异常
异常也同样分为两种,如下
- 第一种:程序语法没有错误,但在执行中遇到逻辑或者算法问题。
- 第二种:程序在运行过程中计算机出现异常,如内存不够,IO错误
3. 错误和异常的区别
错误是程序在运行前的语法错误或者逻辑错误,语法错误可以在程序执行前修改,而逻辑错误无法修改。
而异常分为两步,一是异常的产生,解释器检测到错误且认为是异常,抛出异常;二是异常的处理,截获异常,忽略或者终止程序。
以下来自百度:
从软件方面来说,错误是语法或者逻辑上的问题,语法错误指示软件的结构上有错误,导致不能被解释器解释或者编译器无法编译,这些错误必须在程序执行前进行纠正;当程序语法正确后,剩下的就是逻辑错误问题,逻辑错误可能是由于不完整或不合法的输入导致,在其他情况下,可能是逻辑无法生成、计算或输出结果需要的过程无法执行。这些错误通常分别被称为域错误和范围错误。
当Python检测到一个错误时,解释器就会指出当前已经无法继续执行下去,这时就出现异常。
而异常它是因为程序出现了错误而在正常控制流以外采取的行为 这个行为分为两个阶段:首先是引起异常发生的错误,然后是检测阶段。
第一个阶段是在发生了一个异常条件后发生的,只要检测到错误并且意识到异常条件,解释器会引发一个异常,引发也可以叫作触发或生成,解释器通过它通知当前控制流有错误发生。
Python也允许程序员自己引发异常,无论是Python解释器还是程序员引发的,异常就是错误发生的信号,当前流将被打断,用来处理这个错误并采取相应的操作,这就是第二个阶段。
对异常的处理发生在第二阶段,异常引发后,可以调用很多不同的操作,可以是忽视错误,或是减轻问题的影响后设法继续执行程序,所有的这些操作都代表一种继续,或是控制的分支,关键是程序员在错误发生时可以指示程序如何执行。
二 python的异常处理模块
python处理异常的主要是try…except…语句块,具体细分如下
1. try…except
try:
会出现异常的代码
except:
出现异常后,要执行的代码
try…except的执行逻辑如下
- 1 先执行try和except之间的代码,如果代码正常运行,没有抛异常,则忽略except后的代码,try…except运行结束。
- 2 如果try和except之间的代码执行抛异常,则抛出的异常和except要处理的异常类型相匹配,则执行except后的代码
- 3 如果执行try和except之间的代码抛异常,该异常和except要处理的异常不匹配,则把异常返回try中抛出。
#try...except代码块
#try后代码运行正常,忽略except
try:
a, b = 2, 2
print(a / b)
except ZeroDivisionError as err:
print("报错信息如下:", err)
#try...except代码块
#执行try后代码报错,except处理异常
try:
a, b = 2, 0
print(a / b)
except ZeroDivisionError as err:
print("报错信息如下:", err)
不过需要注意的还有以下两点:
- 一个try后可以跟多个except分支,最多只有一个被执行
- 一个except可以处理多个异常类型,从前往后依次匹配
#多个except分支
try:
with open("test.txt", 'r') as f:
file = f.read()
msg = int(file)
except OSError as err:
print("报错信息如下:", err)
except TypeError as err:
print("报错信息如下:", err)
#一个except处理多个异常
try:
with open("test1.txt", 'r') as f:
file = f.read()
msg = int(file)
except (OSError, ValueError) as err:
print("报错信息如下:", err)
2. try…except…else
try:
会出现异常的代码
except:
出现异常后,要执行的代码
else:
没有出现异常时要执行的代码
try…except…else语句:else语句放在所有except的后面,因为else是在try里面的代码执行没有错误的时候才执行的,若执行try报错,则else不会被执行。如下
#try...except...else语句
try:
file = open("mytest.txt", 'r')
except IOError as err:
print("打开文件报错:", err)
else:
#当文件正常打开时,执行以下代码
msg = file.read()
print(msg)
mytest.txt文件不存在,捕获异常,不会执行else
打开存在的test.txt文件,执行else语句读取内容
#try...except...else语句
try:
file = open("test.txt", 'r')
except IOError as err:
print("打开文件报错:", err)
else:
#当文件正常打开时,执行以下代码
msg = file.read()
print(msg)
3. try…except…finally
try:
会出现异常的代码
except:
出现异常后,要执行的代码
else:
没有出现异常时要执行的代码
finally:
不管有没有异常都要执行的代码
else是执行try后代码没有异常才行会执行,而finally是不管执行try出不出现异常都会执行,如下
#try...finally语句
try:
a, b = 1, 0
res = a / b
except ZeroDivisionError as err:
print("请检查输入:", err)
else:
print("输入合法性检查通过...")
print("结果如下:", res)
finally:
print("你输入的数字是:", a, b)
输入除数0,没有执行else,执行finally
输入正常,执行else和finally
#try...finally语句
try:
a, b = 1, 2
res = a / b
except ZeroDivisionError as err:
print("请检查输入:", err)
else:
print("输入合法性检查通过...")
print("结果如下:", res)
finally:
print("你输入的数字是:", a, b)
三 raise 抛出异常
python不仅能够自己捕获异常并抛出,还能够让程序员自己指定抛出异常。在python中使用关键字raise,能够抛出一个指定的异常,语法格式如下
raise Exception(异常描述)
#参数解释
Exception: 一个异常类名字或者就是Exception
#如果输入不全是数字,则使用raise抛出异常
num = '123ghf'
def number():
#判断字符串是否全为数字
in_str = num.isdigit()
if in_str == False:
raise Exception('输入非法,请重新输入')
else:
return int(num)
num = number()
print(num)
输入全是数字,不会raise异常
#如果输入不全是数字,则使用raise抛出异常
num = '123456'
def number():
#判断字符串是否全为数字
in_str = num.isdigit()
if in_str == False:
raise Exception('输入非法,请重新输入')
else:
return int(num)
num = number()
print(num)
四 自定义异常
除了python内建的异常类,我们还可以自定义属于自己的异常,在自定义异常类时,异常类要继承自Exception类,直接或间接都可以。
#自定义异常
class MyLengthException(Exception):
def __init__(self, length):
self.length = length
#对输入长度进行校验,不符合要求则抛MyLengthException异常
try:
low_limit, higth_limit = 6, 12
pwd = input("请输入你的密码:")
if len(pwd) < 6 or len(pwd) > 12:
raise MyLengthException(len(pwd))
except MyLengthException as err:
print("密码长度输入非法,请重新输入8到12位的密码")
else:
print("你的密码为:{} 请确认".format(pwd))
输入长度不符合要求