在我們日常的程式設計過程中,經常會出現報錯的情況,那鮮紅的顏色讓很多的程式猿心慌慌,寫碼一小時,找錯一整天,所以今天我們就來細緻的講解一下程式執行中的異常報錯,讓我們不在恐懼那小小的程式報錯(error),首先我們得知己知彼,才能百戰不殆!!???
當程式在執行**現的錯誤,或邏輯語法出現問題,直譯器此時無法繼續正常執行,反而出現了一些錯誤提示,這就是異常(錯誤或者bug),程式執行過程**現了異常,輕則無法實現功能或功能出錯,重則整個程式崩潰
以下面的報錯為例:
nameerror: name 'a'
isnot defined
異常資訊 ":"之前的是異常類 之後是異常資訊
常見的異常類:
知道了什麼是異常,我們就可以採用異常捕獲的方式來進行解決:
捕獲異常是在程式設計中常用的一種處理**可能出現漏洞的一些基礎解決方案
捕獲異常的做法 使用 try-expect 語法
try
:# 將自己覺得可能出現異常的模組**全部放到try裡面
print
("輸出程式"
)# 並沒有定義a變數,所以直接進行輸出的話就會報錯
# nameerror: name 'a' is not defined
print
(a)except
:# 如果上面的try出現了異常那麼程式不會進行報錯,而是進入except裡面執行程式
print
("出現錯誤"
)
但是這種方法只會知道**出現了問題,卻不知道具體出現的問題或具體**出現的問題
在捕獲多個異常的時候,可以在except後用元組的方式寫入多種異常類,也可以採用多個except
try
:print
(a)print(1
+"2"
)except
(typeerror,nameerror)
:print
("出現異常!"
)
但是這裡的異常類要包括可能出現的所有異常類,如果有"漏網之魚"則程式還是會報錯出現異常
這裡我們得知道所有異常類都是乙個類,都有乙個exception父類,因此,我們可以
try
:print
(a)print(1
+"2"
)except exception as result:
# as+變數名 輸出變數名會輸出異常的具體資訊
print
(result)
當我們發現了在try中的**並沒有異常時,我們可以用else來輸出我們想要的操作**
else 表示的是如果**沒有異常應該輸出的結果
finnally表示最終結果,不論**是否捕獲到異常(不管是進入了except還是else)都會執行finnally中的**
try
:print
(a)except exception as result:
print
(result)
else
:print
("**無異常!"
)finally
:print
("程式執行完畢"
)
俗話說的好,實踐是檢驗真理的唯一標準,我們學程式也不能光是紙上談兵,所以我們將結合下面的這個案例對異常的傳遞進行講解:
案例:
物件的必備屬性:姓名、年齡、性別、身高、體重
在註冊過程中需要檢測:姓名2-4位字元
入有誤要求丟擲異常並重新填寫
# 建立乙個類並新增姓名、年齡、性別、身高、體重屬性
class
register
(object):
def__init__
(self, name, age, ***, height, weight)
: self.name = name
self.age = age
self.*** = ***
self.height = height
self.weight = weight
self.add(
)def
add(self)
:dict
=class
nnameinputerror
(exception)
:# 建立乙個自定義的異常類
def__init__
(self,name)
: self.name=name
def__str__
(self)
:return f"你輸入的姓名為:,不符合條件,輸入的姓名長度應為2-4位字元!"
defmain()
:# 建立程式主入口
while
true
:# 建立迴圈,使我們每次輸入錯誤的時候都可以再次重新輸入
try:
name=
input
("請輸入姓名:")if
2>
len(name)
orlen
(name)
>4:
# 自定義異常
raise nnameinputerror(name)
# raise 關鍵字用於引發nnameinputerror異常
except exception as nameerror:
print
(nameerror)
else
:global new_name # 利用global函式是name的值可以影響到全域性
new_name=name
break
# 利用break跳出while迴圈
異常有時可能會成為令人頭疼的報錯,但如果我們能夠將其理解透徹,理解其中的門門道道,我們就可以將異常加之利用,稱為程式猿手中的趁手**!! 震驚,這個碼農竟然是個混子!
好久都沒寫東西了,不管是筆還是鍵盤,上次用書面做總結,應該是在三年前畢業時,真讓人害怕.png。也是看了別人的年終總結,感覺有些觸動。時間很快,這個概念是在我大學的時候才體會到的,分析了一下,根本原因是從高中畢業開始,白天時間被大大縮短了 高中畢業前早6晚11,大學時早10晚11,工作後早9晚12 ...
吃雞手遊竟然是Python寫的?
吃雞 有多熱,已經不用多說。但你知道嗎?你熱愛的 吃雞 可能是用python寫的。網易的兩大遊戲客戶端引擎,neox 和 messiah,都是使用 python 作為指令碼語言的。具體來說,伺服器端可以說是完全python,畢竟能夠熱更新的python可以不停服!當然遊戲的客戶端核心引擎部分,還是用...
Object Pascal與C 竟然是相同的!
object pascal與c 的相同之處!竟然這麼相同,包括相似的程式結構 而且,object pascal的語法竟然比c 還嚴格 怪不得borland能把object pascal和c 能混用 我看到以前有人說要把delphi中的vcl用c來寫,其實根本沒這個必要,這個vcl很容易地就可以轉成用...