pycharm的debug調(diào)試以及異常,Python中錯(cuò)誤的處理過程
第一次寫關(guān)于pycharm的debug調(diào)試以及python代碼運(yùn)行報(bào)錯(cuò)處理的帖子,錯(cuò)誤地方請(qǐng)大家指出。
第一個(gè)部分:pycharm的debug調(diào)試
作為一個(gè)非科班出生的學(xué)生,平時(shí)看代碼的時(shí)候特別的難懂,這時(shí)候?qū)Υadebug單步調(diào)試可以很好的看代碼的具體信息。讓我們能夠更加清晰的理解代碼具體傳遞過程。
debug:我們?cè)趐ycharm窗口的右上角可以看見這個(gè)小蟲子(七星瓢蟲)圖標(biāo)。
同時(shí)我們也可以右擊鼠標(biāo),這時(shí)候也可以發(fā)現(xiàn)這個(gè)小蟲子。
當(dāng)然如果代碼沒有錯(cuò)誤,點(diǎn)擊小蟲子和run(上圖最左邊的三角符號(hào))運(yùn)行是一樣的效果。
如果我們想讓它在某一行停下來(lái),我們可以在某一行打斷點(diǎn)(就在某一行旁邊點(diǎn)擊鼠標(biāo)左鍵),如下圖:這時(shí)候debug,代碼運(yùn)行從第一行到第12行,而第13行代碼停止運(yùn)行。
而Special Variables為特殊變量:在這里會(huì)顯示運(yùn)行結(jié)果,如下圖。
Special Variables上邊的結(jié)果為正常變量(如上圖)
下邊重點(diǎn)介紹幾個(gè)按鈕:
1.step over(F8) 單步調(diào)試
在當(dāng)前這個(gè)腳本安裝代碼順序逐行運(yùn)行,點(diǎn)擊一下,就會(huì)在Variables顯示運(yùn)行結(jié)果,如下圖但我按鍵盤F8鍵,藍(lán)色行由17行跳轉(zhuǎn)到18行,Variables和17行后邊都會(huì)顯示詳細(xì)信息。
2.Step Into(F7) 單步調(diào)試
在單步執(zhí)行時(shí),遇到子函數(shù)就進(jìn)入并且繼續(xù)單步執(zhí)行,有的會(huì)跳到源代碼里面去執(zhí)行。
如下圖,我將第13行打上斷點(diǎn),當(dāng)我按鍵盤鍵F7的時(shí)候直接跳入定義的函數(shù)中去,這時(shí)候藍(lán)色行在迪行,我們可以看到第6行的詳細(xì)信息。
3.Step Into My Code(Alt+Shift+F7快捷鍵)
在單步執(zhí)行時(shí),遇到子函數(shù)就進(jìn)入并且繼續(xù)單步執(zhí)行,不會(huì)進(jìn)入到源碼中。所以Step Into My Code就我而言功能和Step Into比較相似,一般而言用處不大。
4.Step Out(Shift+F8快捷鍵)
當(dāng)我們運(yùn)行代碼進(jìn)入了一個(gè)函數(shù)體中,看了幾行代碼懂這個(gè)函數(shù)體是什么意思了,我想要跳出當(dāng)前函數(shù)體,返回調(diào)用此函數(shù)的代碼行,即使用此功能即可。這個(gè)功能還是比較方便。
5.Run to Cursor(Alt+F9)
如果我們打了多個(gè)斷點(diǎn)的時(shí)候,我們按鍵盤F9鍵,直接從當(dāng)前斷點(diǎn)運(yùn)行到下一個(gè)斷點(diǎn)。如果只打了一個(gè)斷點(diǎn),直接運(yùn)行到腳本結(jié)束。
當(dāng)然我覺得用的最多的應(yīng)該是Step Over(F7)和Step Into(F8)這兩個(gè)鍵,這就是我對(duì)pycharm的debug調(diào)試功能的理解,有什么講錯(cuò)了的地方請(qǐng)大家指出,謝謝!
第二部分:異常,Python 中錯(cuò)誤的處理方式
這里邊所用到的代碼小例子是看b站視頻所講解的小例子。
當(dāng)程序在運(yùn)行時(shí) Python 解釋器遇到到一個(gè)錯(cuò)誤,這時(shí)候就會(huì)停止程序的執(zhí)行,并且提示一些錯(cuò)誤信息,這就是異常。
1.簡(jiǎn)單的捕獲異常語(yǔ)法
我們可以增加 try(嘗試) 來(lái)捕獲異常。
捕獲異常最簡(jiǎn)單的語(yǔ)法格式:
try: 嘗試執(zhí)行的代碼 except: 出現(xiàn)錯(cuò)誤的處理
try except 語(yǔ)句的執(zhí)行流程如下:
我們執(zhí)行 try (嘗試)里面的代碼塊,這個(gè)時(shí)候是不確定這個(gè)代碼能否正常執(zhí)行。執(zhí)行異常時(shí)系統(tǒng)會(huì)自動(dòng)生成一個(gè)異常類型,并將該異常交給 Python 解釋器。
Python 解釋器收到異常對(duì)象,會(huì)通過except塊來(lái)處理這個(gè)異常。
如果Python 解釋器找不到處理異常的 except 塊程序運(yùn)行終止,Python 解釋器也將退出。
小例子:
try: # 提示用戶輸入一個(gè)數(shù)字 num = int(input("請(qǐng)輸入數(shù)字:")) except: print("請(qǐng)輸入正確的數(shù)字")
這時(shí)候運(yùn)行代碼,輸入正確數(shù)字9,會(huì)出現(xiàn)運(yùn)行正常并程序運(yùn)行結(jié)束
如果這個(gè)時(shí)候我輸入一個(gè)漢字或者一個(gè)字母,這個(gè)時(shí)候會(huì)通過except塊來(lái)處理這個(gè)異常。
2.錯(cuò)誤類型捕獲
在程序執(zhí)行時(shí)遇到不同類型的異常,做出不同的響應(yīng),這個(gè)時(shí)候我們需要捕獲錯(cuò)誤類型是什么。
語(yǔ)法格式:
try: # 嘗試執(zhí)行的代碼 pass except 錯(cuò)誤類型1: # 針對(duì)錯(cuò)誤類型1,對(duì)應(yīng)的代碼處理 pass except (錯(cuò)誤類型2, 錯(cuò)誤類型3): # 針對(duì)錯(cuò)誤類型2 和 3,對(duì)應(yīng)的代碼處理 pass except Exception as result: print("未知錯(cuò)誤 %s" % result)
我們可以用一個(gè) except 塊可以同時(shí)處理多種異常。
小例子:
try: num = int(input("請(qǐng)輸入整數(shù):")) result = 8 / num print(result) except ValueError: print("請(qǐng)輸入正確的整數(shù)") except ZeroDivisionError: print("除 0 錯(cuò)誤")
當(dāng)我運(yùn)行程序,輸入hah,結(jié)果如下:
當(dāng)我運(yùn)行程序,輸入0,結(jié)果如下:
顯然不同類型的錯(cuò)誤,運(yùn)行后通過except塊來(lái)處理這個(gè)異常的類型也不一樣。
當(dāng)然在開發(fā)時(shí),要預(yù)判到所有可能出現(xiàn)的錯(cuò)誤,還是有一定難度的。這時(shí)候可以使用捕獲未知錯(cuò)誤,語(yǔ)法如下:
except Exception as result: print("未知錯(cuò)誤 %s" % result)
3.異常捕獲的完整語(yǔ)法
當(dāng)然為了能夠處理復(fù)雜的異常情況,完整的異常語(yǔ)法如下:
try: # 嘗試執(zhí)行的代碼 pass except 錯(cuò)誤類型1: # 針對(duì)錯(cuò)誤類型1,對(duì)應(yīng)的代碼處理 pass except 錯(cuò)誤類型2: # 針對(duì)錯(cuò)誤類型2,對(duì)應(yīng)的代碼處理 pass except (錯(cuò)誤類型3, 錯(cuò)誤類型4): # 針對(duì)錯(cuò)誤類型3 和 4,對(duì)應(yīng)的代碼處理 pass except Exception as result: # 打印錯(cuò)誤信息 print(result) else: # 沒有異常才會(huì)執(zhí)行的代碼 pass finally: # 無(wú)論是否有異常,都會(huì)執(zhí)行的代碼 print("無(wú)論是否有異常,都會(huì)執(zhí)行的代碼")
else
:只有在沒有異常時(shí)才會(huì)執(zhí)行的代碼。finally
: 無(wú)論是否有異常,都會(huì)執(zhí)行的代碼。
try: num = int(input("請(qǐng)輸入整數(shù):")) result = 8 / num print(result) except ValueError: print("請(qǐng)輸入正確的整數(shù)") except ZeroDivisionError: print("除 0 錯(cuò)誤") except Exception as result: print("未知錯(cuò)誤 %s" % result) else: print("正常執(zhí)行") finally: print("執(zhí)行完成,但是不保證正確")
4.異常的傳遞
當(dāng)函數(shù)/方法執(zhí)行出現(xiàn)異常,會(huì)將異常傳遞給函數(shù)/方法的調(diào)用一方,如果傳遞到主程序,仍然沒有異常處理,程序才會(huì)被終止。在開發(fā)中,可以在主函數(shù)中增加異常捕獲,而在主函數(shù)中調(diào)用的其他函數(shù),只要出現(xiàn)異常,都會(huì)傳遞到主函數(shù)的異常捕獲中,這樣就不需要在代碼中,增加大量的異常捕獲,能夠保證代碼的整潔。
小例子:
- 定義函數(shù) demo1() 提示用戶輸入一個(gè)整數(shù)并且返回
- 定義函數(shù) demo2() 調(diào)用 demo1()
- 在主程序中調(diào)用 demo2()
def demo1(): return int(input("請(qǐng)輸入一個(gè)整數(shù):")) def demo2(): return demo1() try: print(demo2()) except ValueError: print("請(qǐng)輸入正確的整數(shù)") except Exception as result: print("未知錯(cuò)誤 %s" % result)
我嘗試在三個(gè)地方輸入:
def demo1(): # try: return int(input("請(qǐng)輸入一個(gè)整數(shù):")) # except: # pass def demo2(): # try: return demo1() # except: # pass # try: demo2() # print(demo2()) # except ValueError: # print("請(qǐng)輸入正確的整數(shù)") # except Exception as result: # print("未知錯(cuò)誤 %s" % result)
看錯(cuò)三步法
1.看line后面的數(shù)字,表示在哪一行犯錯(cuò)了,快速定位
2.看列出的這行代碼,準(zhǔn)確定位
3.報(bào)錯(cuò)原因:TypeError這一行就是闡釋為什么錯(cuò)了
其實(shí)我認(rèn)為在最后一句報(bào)錯(cuò)那個(gè)地方去處理就行。
但是額,對(duì)于底下有很多行報(bào)紅,這里我也是不太清楚,只能按照異常傳遞試,如果說錯(cuò)了麻煩大家指出我的錯(cuò)誤,并且希望大家也說說多行報(bào)紅該怎么去看這種錯(cuò)誤,謝謝大家。
異常分類
BaseException
所有異常的基類Exception
常見錯(cuò)誤的基類ArithmeticError
所有數(shù)值計(jì)算錯(cuò)誤的基類Warning
警告的基類AssertError
斷言語(yǔ)句(assert)失敗AttributeError
嘗試訪問未知的對(duì)象屬性DeprecattionWarning
關(guān)于被棄用的特征的警告EOFError
用戶輸入文件末尾標(biāo)志EOF(Ctrl+d)FloattingPointError
浮點(diǎn)計(jì)算錯(cuò)誤FutureWarning
關(guān)于構(gòu)造將來(lái)語(yǔ)義會(huì)有改變的警告GeneratorExit generator.close()
方法被調(diào)用的時(shí)候ImportError
導(dǎo)入模塊失敗的時(shí)候IndexError
索引超出序列的范圍KeyError
字典中查找一個(gè)不存在的關(guān)鍵字KeyboardInterrupt
用戶輸入中斷鍵(Ctrl+c)MemoryError
內(nèi)存溢出(可通過刪除對(duì)象釋放內(nèi)存)NamerError
嘗試訪問一個(gè)不存在的變量NotImplementedError
尚未實(shí)現(xiàn)的方法OSError
操作系統(tǒng)產(chǎn)生的異常(例如打開一個(gè)不存在的文件)OverflowError
數(shù)值運(yùn)算超出最大限制OverflowWarning
舊的關(guān)于自動(dòng)提升為長(zhǎng)整型(long)的警告PendingDeprecationWarning
關(guān)于特征會(huì)被遺棄的警告ReferenceError
弱引用(weak reference)試圖訪問一個(gè)已經(jīng)被垃圾回收機(jī)制回收了的對(duì)象RuntimeError
一般的運(yùn)行時(shí)錯(cuò)誤RuntimeWarning
可疑的運(yùn)行行為(runtime behavior)的警告StopIteration
迭代器沒有更多的值SyntaxError
Python的語(yǔ)法錯(cuò)誤SyntaxWarning
可疑的語(yǔ)法的警告IndentationError
縮進(jìn)錯(cuò)誤TabError
Tab和空格混合使用SystemError
Python編譯器系統(tǒng)錯(cuò)誤SystemExit
Python編譯器進(jìn)程被關(guān)閉TypeError
不同類型間的無(wú)效操作UnboundLocalError
訪問一個(gè)未初始化的本地變量(NameError的子類)UnicodeError
Unicode相關(guān)的錯(cuò)誤(ValueError的子類)UnicodeEncodeError
Unicode編碼時(shí)的錯(cuò)誤(UnicodeError的子類)UnicodeDecodeError
Unicode解碼時(shí)的錯(cuò)誤(UnicodeError的子類)UserWarning
用戶代碼生成的警告ValueError
傳入無(wú)效的參數(shù)ZeroDivisionError
除數(shù)為零
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python中selenium_webdriver下拉框操作指南
selenium 雖然過了這么多年,但是到目前為止依然是比較流行的自動(dòng)化框架了,下面這篇文章主要給大家介紹了關(guān)于Python中selenium_webdriver下拉框操作的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01使用Python批量刪除MySQL數(shù)據(jù)庫(kù)的全部外鍵
這篇文章主要為大家詳細(xì)介紹了如何使用Python批量刪除MySQL數(shù)據(jù)庫(kù)的全部外鍵,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04Python for循環(huán)及基礎(chǔ)用法詳解
這篇文章為大家介紹python for 循環(huán),它常用于遍歷字符串、列表、元組、字典、集合等序列類型,逐個(gè)獲取序列中的各個(gè)元素2019-11-11Python實(shí)現(xiàn)歷史記錄功能(實(shí)際案例)
很多應(yīng)用程序都有瀏覽用戶的歷史記錄的功能,瀏覽器可以查看最近訪問過的網(wǎng)頁(yè),現(xiàn)在我們制作了一個(gè)簡(jiǎn)單的猜數(shù)字的小游戲,添加歷史記錄功能,顯示用戶最近猜過的數(shù)字,如何實(shí)現(xiàn)呢?跟隨小編一起看看吧2022-04-04基于PyScreeze實(shí)現(xiàn)截屏和定位功能
PyScreeze 是一個(gè)開源的 Python 屏幕截圖模塊,適用于 Python 2 和 Python 3,該項(xiàng)目由開源技術(shù)專家 Al Sweigart 創(chuàng)建,旨在提供一個(gè)簡(jiǎn)單而強(qiáng)大的工具,用于屏幕截圖以及圖像識(shí)別功能,本文就給大家介紹了基于PyScreeze實(shí)現(xiàn)截屏和定位功能,需要的朋友可以參考下2025-04-04Python實(shí)現(xiàn)簡(jiǎn)單的猜單詞小游戲
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡(jiǎn)單的猜單詞小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10python3對(duì)接mysql數(shù)據(jù)庫(kù)實(shí)例詳解
這篇文章主要介紹了python3對(duì)接mysql數(shù)據(jù)庫(kù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04