python之异常处理

本文详细讲解了编程中的错误和异常概念,包括语法错误和逻辑错误的区别,以及Python中的try-except-finally结构。深入探讨了异常处理模块,如何使用raise抛出异常,并介绍了自定义异常的创建方法。适合理解异常管理在Python编程中的重要性。
摘要由CSDN通过智能技术生成

一 错误和异常

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))

在这里插入图片描述
输入长度不符合要求
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值