Python常见异常的处理方式浅析

 更新时间:2023年02月21日 11:13:21   作者:爱吃饼干的小白鼠  
异常指当程序出现错误后程序的处理方法,异常机制提供了程序正常退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器,如序列的下标越界、打开不存在的文件、空引用异常等

一、引言

有一定 Python 编程经验的人估计十有八九使用过异常,异常对于程序的健壮性是毋庸置疑的。

二、使用异常对数据进行初始化

在某些条件下,需要进行数据初始化,但数据不能提前确认,这个时候就可以结合异常的使用来判断是否需要进行初始化。下面的代码中的函数 listDataStatics 用于统计列表中每个元素的出现个数,处理时循环遍历列表,对列表中已经存在的元素计数器加 1,否则如果是键值不存在异常则进行数据初始化:

def listDataStatics(infList):
    dataInf = {}
    for l in infList:
        try:
            dataInf[l] += 1
        except KeyError as e:
            dataInf[l] =1
    return dataInf

当然上述过程也可以用列表的 index 等方法来实现,但个人认为这种方式最简单。

三、使用异常实现重处理

某些异常需要进行重处理,如出现网络连接断开时需要在网络正常后重新访问网络,下面是一个案例。

import urllib,time
def getHtmlPage(url):
    while True:
        try:
            req = urllib.request.Request(url=url)
            text = urllib.request.urlopen(req).read().decode()
        except ConnectionError:
            print("ConnectionError:network has disconnected")
            time.sleep(3)
            continue
        except Exception as e:
            err = str(e)
            if err.find('getaddrinfo failed')>=0:
                print("getaddrinfo failed:network has disconnected")
                time.sleep(3)
                continue
            else: return ''
        else:return text

四、使用异常应对多种潜在情况

在使用 Moviepy1.03 通过 VideoFileClip 执行报 UnicodeDecodeError 错,发现是少数视频有问题,从报错信息看是 Moviepy 的 ffmpeg_reader.py 模块有个如下代码:infos = error.decode(‘utf8’)解码出现问题,将其改为:infos = error.decode(‘ANSI’)顺利解决,但解决后用来加载其他视频文件又报错,后来将代码改成如下方式:

try:
    infos = error.decode('utf8')
except Exception as e:
    infos = error.decode('ANSI')

五、获取异常详细信息

Python 自己抛出的异常会有详细的异常信息,包括异常类型、错误内容、程序代码位置及相关函数调用栈信息,但异常捕获后这些错误信息默认就消失了,为了实现提供与 Python 相同的异常信息,需要异常捕获程序进行处理:

通过类似except Exception as e捕获异常后,打印 e 的内容(也可打印 e.errno、e.strerror)可以提供异常的类型及异常的错误信息说明;

采用 traceback 模块的 print_exc 查看异常对应程序代码位置及相关函数调用栈信息发生异常时,Python 保留引发异常程序的当前状态,并可通过 traceback 跟踪异常发生时与函数调用堆栈有关的信息。程序调用每个函数时,Python 会在“函数调用堆栈”的起始处插入函数名。一旦异常被引发,Python 会搜索异常处理程序,如果当前函数中没有异常处理程序,当前函数会终止执行,Python 会搜索当前函数的调用函数,并以此类推,直到发现匹配的异常处理程序,或者 Python 抵达主程序为止。这一查找合适的异常处理程序的过程就称为“堆栈辗转开解”(StackUnwinding)。

下面代码在访问网站遇到异常时,打印详细的异常错误信息及代码位置:

import urllib,traceback
def getHtmlPage(url):
        try:
            req = urllib.request.Request(url=url)
            text = urllib.request.urlopen(req).read().decode()
        except Exception as e:
                print(f"访问网站获取推荐文章失败,当前url={url},异常原因:\n{e}\n" + '\n' + traceback.format_exc() )
                return ''
        else:return text

六、人工触发异常

除了程序自动引发的异常外,也可以通过 raise 函数主动抛出异常,一般用在程序主动检查发现错误的情况,避免错误扩散。下面这段代码检查列表 infList 中的元素是否为列表,如果不是列表则抛出异常:

    for row in infList:
        if not isinstance(row,list):
            raise ValueError("checkAndRepairListData实参不满足第一个参数为二维列表的要求!\n"+traceback.format_exc())

可以看到,使用 raise 抛出异常时,需要提供异常类型和异常信息,并在此时也可以获取程序的代码位置及函数堆栈信息。

七、异常嵌套

异常允许嵌套,包括在一个 try...except 语句的 try 和 except 之间嵌入另一个 try...except 语句,也可以在异常处理语句、else、finally 子句中再嵌套 try...except 语句,在此就不举例介绍了。

小结

本文介绍了 Python 异常用于数据初始化、业务重处理、多情况处理的三种应用方式,以及获取异常详细信息、人工触发异常及异常嵌套等与异常相关的知识

到此这篇关于Python常见异常的处理方式浅析的文章就介绍到这了,更多相关Python异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python优化代码的技巧分享

    Python优化代码的技巧分享

    Python 是 一种用着很爽的语言,Python也有着很多特性和技巧,可以帮助我们编写更高效、更优雅、更易维护的代码,下面小编为大家整理了一些常用的Python代码优化的简单小技巧,希望对大家有所帮助
    2023-09-09
  • 二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)

    二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)

    这篇文章主要介绍了使用Python email模块、smtplib库发送邮件的实例,大家参考使用
    2013-12-12
  • Python递归生成全排列序列实操

    Python递归生成全排列序列实操

    这篇文章主要介绍了Python递归生成全排列序列实操,文章给予Python递归的相关资料展开对全排列序列的实现介绍,需要的小伙伴可以参考一下
    2022-04-04
  • 解决Pycharm在Debug的时候一直“Connected”没有下一步动作问题

    解决Pycharm在Debug的时候一直“Connected”没有下一步动作问题

    这篇文章主要介绍了解决Pycharm在Debug的时候一直“Connected”没有下一步动作问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题

    关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribu

    这篇文章主要介绍了pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 解决,需要的朋友可以参考下
    2020-11-11
  • Python中的取整、取余运算方法

    Python中的取整、取余运算方法

    数据处理是编程中不可避免的,很多时候都需要根据需求把获取到的数据进行处理,取整则是最基本的数据处理。取整的方式则包括向下取整、四舍五入、向上取整等等,这篇文章主要介绍了Python中的取整、取余运算,需要的朋友可以参考下
    2022-11-11
  • python时间日期操作方法实例小结

    python时间日期操作方法实例小结

    这篇文章主要介绍了python时间日期操作方法,结合实例形式总结分析了Python针对日期时间的转换、计算相关操作技巧,需要的朋友可以参考下
    2020-02-02
  • Django基础三之视图函数的使用方法

    Django基础三之视图函数的使用方法

    这篇文章主要介绍了Django基础三之视图函数的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • python基础知识之try...except...的详细用法实例

    python基础知识之try...except...的详细用法实例

    在各种编程语言进行工作和学习的过程中,都会有一些错误异常,下面这篇文章主要给大家介绍了关于python基础知识之try...except...的详细用法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • python中reduce()函数的使用方法示例

    python中reduce()函数的使用方法示例

    reduce() 函数会对参数序列中元素进行累积,下面这篇文章主要给大家介绍了关于python中reduce()函数的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-09-09

最新评论