Python异常捕获

了解异常

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

可能导致的问题

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

对于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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值