了解异常
当检测到一个错误时,解释器就无法继续执行了,反⽽出现了一些错误的提示,这就是所谓的”异常”。
可能导致的问题
对于本地应用程序来说,可能导致工程停止,应用程序闪退;
对于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的内置模块,创建堆栈队列,用来处理多线程通信,主要方法如下:
-
Queue.qsize()
返回队列中数据元素的个数。
-
Queue.empty()
如果队列为空,返回 True,否则返回 False。
-
Queue.full()
如果队列中元素个数达到上限,返回 True,否则返回 False。
-
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,设置超时时间。
-
Queue.put_nowait(item)
相当于 Queue.put(item, block=False),当队列中元素个数达到上限继续往里放数据时直接引发 queue.Full 异常。
-
Queue.get(block=True, timeout=None)
从队列中取出数据并返回该数据内容。
block,当队列中没有数据元素继续取数据时:如果 block=False,直接引发 queue.Empty 异常;如果 block=True,且 timeout=None,则一直等待直到有数据入队列后可以取出数据;如果 block=True,且 timeout=N,N 为某一正整数时,则等待 N 秒,如果队列中还没有数据放入的话就引发 queue.Empty 异常。
timeout,设置超时时间。
-
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