Python基础知识(第九天)
125.異常的本質_調試核心理念
異常指程序運行過程中出現的非正常現象,例如用戶輸入錯誤、除數為零、需要處理的文件不存在、數組下標越界等。
所謂異常處理,就是指程序在出現問題時依然可以正確的執行剩余的程序,而不會因為異常而終止程序執行。
python 中,引進了很多用來描述和處理異常的類,稱為異常類。異常類定義中包含了該類異常的信息和對異常進行處理的方法。下面較為完整的展示了python 中內建異常類的繼承層次:
python 中一切都是對象,異常也采用對象的方式來處理。處理過程:
1.拋出異常:在執行一個方法時,如果發生異常,則這個方法生成代表該異常的一個對象,停止當前執行路徑,并把異常對象提交給解釋器。
2.捕獲異常:解釋器得到該異常后,尋找相應的代碼來處理該異常。
126.try_一個except基本結構
try:
? ? 被監控的可能引發異常的語句塊
except BaseException?[as e]:
? ? 異常處理語句塊
try 塊包含著可能引發異常的代碼,except 塊則用來捕捉和處理發生的異常。執行的時候,如果 try 塊中沒有引發異常,則跳過 except 塊繼續執行后續代碼;執行的時候,如果 try塊中發生了異常,則跳過 try 塊中的后續代碼,跳到相應的 except 塊中處理異常;異常處理完后,繼續執行后續代碼。
try:print("step1") a = 3/0 print("step2") except BaseException as e: print("step3") print(e)print("step4") step1 step3 division by zero step4127.try_多個except結構
上面的結構可以捕獲所有的異常,工作中也很常見。但是,從經典理論考慮,一般建議盡量捕獲可能出現的多個異常(按照先子類后父類的順序),并且針對性的寫出異常處理代碼。為了避免遺漏可能出現的異常,可以在最后增加 BaseException。結構如下:
try:被監控的、可能引發異常的語句塊except Exception1:處理 Exception1 的語句塊except Exception2:處理 Exception2 的語句塊...except BaseException:處理可能遺漏的異常的語句塊 try:a = input("請輸入被除數:")b = input("請輸入除數:")c = float(a)/float(b)print(c)except ZeroDivisionError:print("異常:除數不能為 0") except TypeError:print("異常:除數和被除數都應該為數值類型") except NameError:print("異常:變量不存在") except BaseException as e:print(e)print(type(e))128.try...except...else結構
try...except...else 結構增加了“else 塊”。如果 try 塊中沒有拋出異常,則執行 else 塊。如果try 塊中拋出異常,則執行 except 塊,不執行 else 塊。
try:a = input("請輸入被除數:")b = input("請輸入除數:")c = float(a)/float(b) except BaseException as e:print(e) else:print("除的結果是:",c)129.try...except...finally結構
try...except...finally 結構中,finally 塊無論是否發生異常都會被執行;通常用來釋放 try 塊中申請的資源。
try:a = input("請輸入一個被除數:")b = input("請輸入一個除數:")c = float(a)/float(b) except BaseException as e:print(e) else:print(c) finally:print("我是 finally 中的語句,無論發生異常與否,都執行!")print("程序結束!") try:f = open("d:/a.txt",'r')content = f.readline()print(content) except BaseException as e:print(e) finally:print("關閉資源")try:f.close()except BaseException as e:print(e) print("程序關閉")130.常見異常匯總和說明
return 語句和異常處理問題
由于 return 有兩種作用:結束方法運行、返回值。我們一般不把 return 放到異常處理結構中,而是放到方法最后。
常見異常的解決
?
| 異常名稱 | 說明 |
| ArithmeticError | 所有數值計算錯誤的基類 |
| AssertionError | 斷言語句失敗 |
| AttributeError | 對象沒有這個屬性 |
| BaseException | 所有異常的基類 |
| DeprecationWarning | 關于被棄用的特征的警告 |
| EnvironmentError | 操作系統錯誤的基類 |
| EOFError | 沒有內建輸入,到達EOF 標記 |
| Exception | 常規錯誤的基類 |
| FloatingPointError | 浮點計算錯誤 |
| FutureWarning | 關于構造將來語義會有改變的警告 |
| GeneratorExit | 生成器(generator)發生異常來通知退出 |
| ImportError | 導入模塊/對象失敗 |
| IndentationError | 縮進錯誤 |
| IndexError | 序列中沒有此索引(index) |
| IOError | 輸入/輸出操作失敗 |
131.with上下文管理
finally 塊由于是否發生異常都會執行,通常我們放釋放資源的代碼。其實,我們可以通過 with 上下文管理,更方便的實現釋放資源的操作。
with 上下文管理的語法結構如下:with context_expr?[ as var]: 語句塊
with 上下文管理可以自動管理資源,在 with 代碼塊執行完畢后自動還原進入該代碼之前的現場或上下文。不論何種原因跳出 with 塊,不論是否有異常,總能保證資源正常釋放。極大的簡化了工作,在文件操作、網絡通信相關的場合非常常用。
with open("d:/bb.txt") as f: for line in f:print(line)132.trackback模塊的使用_異常寫入日志文件
trackback模塊的使用
import traceback try:print("step1")num = 1/0 except:traceback.print_exc() Traceback (most recent call last):File "/Users/zhucan/PycharmProjects/pythonProject1/mypy01.py", line 4, in <module>num = 1/0 ZeroDivisionError: division by zero step1異常寫入日志文件
? import traceback try:print("step1")num = 1/0 except:with open("d:/a.log","a") as f:traceback.print_exc(file=f)?133.自定義異常類_raise拋出異常
自定義異常類
程序開發中,有時候我們也需要自己定義異常類。自定義異常類一般都是運行時異常,通常繼承 Exception 或其子類即可。命名一般以 Error、Exception 為后綴。
class AgeError(Exception):def __init__(self,errorInfo):Exception. __init__(self)self.errorInfo = errorInfodef __str__(self):return str(self.errorInfo)+",年齡錯誤!應該在 1-150 之間"if __name__ == "__main__":age = int(input("輸入一個年齡:"))if age<1 or age>150:raise AgeError(age)else:print("正常的年齡:",age)134.pycharm的調試模式
進行調試的核心是設置斷點。程序執行到斷點時,暫時掛起,停止執行。就像看視頻按下停止一樣,我們可以詳細的觀看停止處的每一個細節。
斷點
程序運行到此處,暫時掛起,停止執行。我們可以詳細在此時觀察程序的運行情況,方便做出進一步的判斷。
1.設置斷點
(1)在行號后面單擊即可增加斷點
?
(2)在行號后面單擊即可增加斷點
進入調試視圖
我們通過如下三種方式都可以進入調試視圖:
1.單擊工具欄上的按鈕:
2.右鍵單擊編輯區,點擊:debug?‘模塊名’
3.快捷鍵:shift+F9
?進入調試視圖后,布局如下:
?
左側為“瀏覽幀”:調試器列出斷點處,當前線程正在運行的方法,每個方法對應一個“棧幀”。最上面的 ?是當前斷點所處的方法。
變量值觀察區:調試器列出了斷點處所在方法相關的變量值。我們可以通過它,查看變量的值的變化,也可以通過?,增加要觀察的變量。
我們通過上圖中的按鈕進行調試操作,它們的含義如下:
| 中文名稱 | 英文名稱 | 圖標和快捷鍵 | 說明 |
| 顯示當前所有斷點 | show Execution Point | Alt+F10 | |
| 單步調試: 遇到函數跳過 | step over | F8 | 若當前執行的是一個函數,則會把這個 函數當做整體一步執行完。不會進入這個函數內部 |
| 單步調試: 遇到函數進入 | step into | F7? | 若當前執行的是一個函數,則會進入這個函數內部 |
| 跳出函數 | step out | Shift+F8 | 當單步執行到子函數內時,用 step out 就可以執行完子函數余下部分,并返回到上一層函數 |
| 執行的光標處 | run to cursor | Alt+F9 | 一直執行,到光標處停止,用在循環內 部時,點擊一次就執行一個循環 |
總結
以上是生活随笔為你收集整理的Python基础知识(第九天)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python基础知识(第八天)
- 下一篇: websocket python爬虫_p