4

Python异常的这些知识点你都get到了吗?

 3 years ago
source link: https://blog.csdn.net/LaoYuanPython/article/details/115608009
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Python异常的这些知识点你都get到了吗?_老猿Python-CSDN博客

有一定Python编程经验的人估计十有八九使用过异常,异常对于程序的健壮性是毋庸置疑的。如果缺乏这些知识的,找个python语言教程找到异常相关章节都可以查到,也可以参考老猿最近看到的CSDN“学渣渣渣渣渣”博主的博文《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')

这样再也没报错了。具体内容可参考《moviepy用VideoFileClip加载视频时报UnicodeDecodeError: codec cant decode ,No mapping character 错误》。

五、获取异常详细信息

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

  1. 通过类似except Exception as e捕获异常后,打印e的内容(也可打印e.errno、e.strerror)可以提供异常的类型及异常的错误信息说明;
  2. 采用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异常用于数据初始化、业务重处理、多情况处理的三种应用方式,以及获取异常详细信息、人工触发异常及异常嵌套等与异常相关的知识,希望对于大家深入理解异常的应用以及异常相关的知识有所帮助。

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录
  4. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK