是否有辦法防止 urllib3 模塊捕獲 KeyboardInterrupt? 我需要在 KeyboardInterrupt 發生時執行一些程式,但問題是 urllib3 模塊似乎捕捉到了例外而沒有傳遞給它。
我寫了一個示例腳本來演示我的問題。
connector.py
import requests
from time import sleep
class Connector。
def __init__(self):
pass.
def connect(self)。
try:
URL="https://www.gelbeseiten.de"。
print("Connecting")
sleep(1)
print("現在")
requests.get(URL)
requests.get(URL)
requests.get(URL)
requests.get(URL)
except Exception as e:
print("Exception in connect")
raise Exception()
main.py
import connector
def main()。
try:
conn=connector.Connector()
conn.connect()
except Exception as e:
print("Exception in main")
if __name__ == '__main__'/span>:
main()
如果腳本正在執行GET請求,我執行了一個鍵盤中斷(Ctrl C),我所期望的是首先列印出 "connect中的例外",然后是 "main中的例外",但我得到的卻是以下輸出
Traceback (most recent call last):
檔案 "/tmp/test/main.py", 行 11, in < module>
主體()
檔案 "/tmp/test/main.py", 行 6, in main
conn.connect()
檔案 "/tmp/test/connector.py", 行 16, in connect
requests.get(URL)
檔案 "/usr/lib/python3/dist-packages/requests/api.py", line 76, in get
return request('get', url, params=params, **kwargs)
檔案 "/usr/lib/python3/dist-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
檔案 "/usr/lib/python3/dist-packages/requests/sessions.py", line 428, in __exit__
self.close()
檔案 "/usr/lib/python3/dist-packages/requests/sessions.py", line 747, in close
v.close()
檔案 "/usr/lib/python3/dist-packages/requests/adapters.py", line 325, in close
self.poolmanager.clear()
檔案 "/usr/lib/python3/dist-packages/urllib3/poolmanager.py", line 222, in clear
self.pools.clear()
檔案 "/usr/lib/python3/dist-packages/urllib3/_collections.py", line 100, in clear
self.dispose_func(value)
檔案 "/usr/lib/python3/dist-packages/urllib3/poolmanager.py", 行 173, in <lambda>
self.pools = RecentlyUsedContainer(num_pools, dispose_func=lambda p: p.close()
檔案 "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 491, in close
if conn:
鍵盤中斷
這表明模塊urllib3得到了中斷信號,但沒有把它傳遞給我的例外處理程式。有什么方法可以獲得我的預期行為嗎?
uj5u.com熱心網友回復:
KeyboardInterrupt將不會被捕獲。
exception KeyboardInterrupt 當用戶點擊中斷鍵(通常是Control-C或Delete)時引發的。在執行程序中,會定期對中斷進行檢查。該例外繼承自BaseException,以便不被捕獲Exception的代碼意外捕獲,從而阻止解釋器的退出。
參見https://docs.python.org/3/library/exceptions.html#KeyboardInterrupt
uj5u.com熱心網友回復:
這里的問題是,KeyboardInterrupt不是Exception的子類。如果你特別想捕捉KeyboardInterrupt,你必須使用except KeyboardInterrupt as e:。
另外,最好使用raise e而不是引發一個新的Exception。
uj5u.com熱心網友回復:
我認為你需要改變你的raise腳本,因為KeyboardInterrupt似乎不像是從Exception繼承的。相反,它是來自BaseException。
請在你的connector.py中嘗試使用以下代碼。
import requests
from time import sleep
class Connector。
def __init__(self):
pass.
def connect(self)。
try:
URL="https://www.gelbeseiten.de"。
print("Connecting")
sleep(1)
print("現在")
requests.get(URL)
requests.get(URL)
requests.get(URL)
requests.get(URL)
except Exception as e:
print("Exception in connect")
raise Exception()
except KeyboardInterrupt as e:
print("鍵盤中斷")
引發例外。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/320030.html
標籤:
上一篇:未處理的例外:在openCV的cvtColor()處
下一篇:針對不同日志級別的例外標準
