Python异常捕获

导读:本篇文章讲解 Python异常捕获,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

了解异常

当检测到一个错误时,解释器就无法继续执行了,反⽽出现了一些错误的提示,这就是所谓的”异常”。

可能导致的问题

对于本地应用程序来说,可能导致工程停止,应用程序闪退;

对于web项目来说,如果服务器因为异常而停止执行,则会导致服务器宕机,并且前端无法得知异常的具体内容。

显然这是一个无法忽视的问题,为此,本文提供的方法可以实现异常的捕获,防止程序闪退,对于web项目来说,可将捕获的异常在前端显示。

线程内异常捕获

基础方法及案例

需求,以 r 模式打开文件,如果文件不存在,则以 w 方式打开

try:
    f = open('test.txt', 'r')
except:
    f = open('test.txt', 'w')

捕获特定异常并获取异常信息

一个特定异常

捕获NameError异常

try:
    print(num)
except NameError as e:
    print("NameError:", e)

如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。

捕获异常信息的另一个方法

try:
    print(num)
except NameError:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    e = str(repr(traceback.format_exception(exc_type, exc_value, exc_traceback)))
    print("NameError:", e)

多个特定异常

try:
    print(num)
except (NameError, IOError) as e:
    print("NameError:", e)

所有特定异常

try:
    print(num)
except Exception as e:
    print("NameError:", e)

没有异常执行的代码

try:
    print(num)
except Exception as e:
    print("NameError:", e)
else:
    print("没有异常")

有无异常都执行的代码

try:
    print(num)
except Exception as e:
    print("NameError:", e)
else:
    print("没有异常")
finally:
    print("一定执行的代码")

主线程捕获子线程异常

子线程异常捕获的关键是怎么把捕获的内容传递给主线程,这里借助queue实现。

queue

queue是python3的内置模块,创建堆栈队列,用来处理多线程通信,主要方法如下:

  1. Queue.qsize()

返回队列中数据元素的个数。

  1. Queue.empty()

如果队列为空,返回 True,否则返回 False。

  1. Queue.full()

如果队列中元素个数达到上限,返回 True,否则返回 False。

  1. Queue.put(item, block=True, timeout=None)

item,放入队列中的数据元素。

block,当队列中元素个数达到上限继续往里放数据时:如果 block=False,直接引发 queue.Full 异常;如果 block=True,且 timeout=None,则一直等待直到有数据出队列后可以放入数据;如果 block=True,且 timeout=N,N 为某一正整数时,则等待 N 秒,如果队列中还没有位置放入数据就引发 queue.Full 异常。

timeout,设置超时时间。

  1. Queue.put_nowait(item)

相当于 Queue.put(item, block=False),当队列中元素个数达到上限继续往里放数据时直接引发 queue.Full 异常。

  1. Queue.get(block=True, timeout=None)

从队列中取出数据并返回该数据内容。

block,当队列中没有数据元素继续取数据时:如果 block=False,直接引发 queue.Empty 异常;如果 block=True,且 timeout=None,则一直等待直到有数据入队列后可以取出数据;如果 block=True,且 timeout=N,N 为某一正整数时,则等待 N 秒,如果队列中还没有数据放入的话就引发 queue.Empty 异常。

timeout,设置超时时间。

  1. Queue.get_nowait()

相当于 Queue.get(block=False)block,当队列中没有数据元素继续取数据时直接引发 queue.Empty 异常。

代码示例

import queue
import threading
import sys


def thread_text(q, i):
    try:
        time.sleep(i)
        raise Exception(u'error')
    except:
        q.put(sys.exc_info())
    

if __name__ =='__main__':
    q = queue.Queue()
    t = threading.Thread(target=thread_text, args=(q, 1))
    t.start()
    while True:
        if q.empty():
            if threading.active_count() == 1:
                break
        else:
            print(q.get())
            raise Exception(u'main error')
    print(u'end')

参考资料

python怎么捕获特定异常? – 知乎 (zhihu.com)

Python将异常信息转为字符串-蒲公英云 (dandelioncloud.cn)

https://blog.csdn.net/weixin_45621200/article/details/120905195

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100767.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!