Python基礎--異常

2021-12-23 莊AC

收錄於話題 #Python自學 14個

1. 概念區分

是由於邏輯或語法導致一個程序無法正常運行的問題, 錯誤的特點是有些錯誤是無法預知的

通知上層調用者,有錯誤產生需要處理, 用作信號通知

是程序出錯時的一種狀態, 當異常發生時,程序不會向下繼續執行,而轉去調用此函數的地方,待處理此錯誤

ZeroDivisionError 除(或取模)零
StopIteration 迭代器沒有更多的值
IOError 輸入輸出操作失敗
ImportError 導入模塊失敗
GeneratorExit 生成器發生異常通知退出
IndexError 序列中沒有此索引
IndentationError 縮緊錯誤
ValueError 傳入無效的參數
AssertionError 斷言語句失敗
NameError 未聲明/初始化對象
AttributeError 對象沒有

詳見:>>> help(__builtins__)

2. 異常捕獲

捕獲異常,將程序轉為正常流程

try:
可能觸發異常的語句
except 錯誤類型1 [as 變量1]:
異常處理語句1, 根據錯誤類型進行匹配,如果匹配成功,則程序轉入正常狀態,並調用處理語句進行處理
except 錯誤類型2 [as 變量2]:
異常處理語句2
...
except:
如果沒有相應的錯誤類型與之匹配,則執行空類型的except子句(except:),之後程序進入正常狀態; 如果沒有該子句並且沒有匹配到任何錯誤類型,則程序的異常狀態會繼續向上(調用處)傳遞,至到傳入解釋執行器後終止程序執行

else:
未發生異常執行語句
finally:
最終執行語句(一定會被執行)

說明:as 部分可以省略
except 子句可以有一個或多個,但至少要有一個
else 子句最多只能有一個,也可以省略不寫
finally 子句最多只能有一個,也可以省略不寫

try-finally語句不會改變程序的狀態(正常/異常)狀態, 用來做觸發異常時必須處理的事情,無論異常是否發生,finally子句都會被執行; 通常try/finally 語句的finally 子句不可以省略,一定不存在except 子句;

try:
可能觸發異常的語句
finally:
最終語句

def fry_egg():
print("打開天然氣!")
print("開始煎雞蛋!")
try:
n = int(input("請輸入蛋的個數")) # 可觸發異常
print("完成煎蛋!共煎了%d個雞蛋" % n)
finally:
print("關閉天然氣!")

fry_egg()

打開天然氣!
開始煎雞蛋!
請輸入蛋的個數a
關閉天然氣!



--
ValueError Traceback (most recent call last)

<ipython-input-5-426dac8668b5> in <module>
8 print("關閉天然氣!")
9
---> 10 fry_egg()


<ipython-input-5-426dac8668b5> in fry_egg()
3 print("開始煎雞蛋!")
4 try:
----> 5 n = int(input("請輸入蛋的個數")) # 可觸發異常
6 print("完成煎蛋!共煎了%d個雞蛋" % n)
7 finally:


ValueError: invalid literal for int() with base 10: 'a'

3. raise 語句

觸發一個錯誤,讓程序進入異常狀態

raise 異常類型 或 異常對象

def make_raise():
print("start")
raise ZeroDivisionError("假的零除")
print("end")

try:
make_raise()
except ZeroDivisionError as err: # err綁定錯誤對象
print("出現錯誤")
print("錯誤類型:", err)

start
出現錯誤
錯誤類型:假的零除

4. assert 語句(斷言語句)

當真值表達式為False時, 用錯誤數據創建一個AssertionError類型的錯誤,並進入異常狀態

assert 真值表達式, 錯誤數據(通常是字符串)

等同於:
if 真值表達式 == False:
raise AssertionError(錯誤數據)

def get_age():
a = input("請輸入年齡:")
a = int(a) # ValueError錯誤
assert a < 150, "年齡太大了"
assert a > 0, "還沒出生"
return a

while True: # 循環讀入解決NameValue錯誤
try:
age = get_age() or 0
break
except AssertionError as e:
print("發生年齡值不合法的錯誤,", e)
except ValueError as e:
print("發生輸入值不能轉為整數的錯誤", e)

print("您輸入的年齡是:", age)

請輸入年齡:a
發生輸入值不能轉為整數的錯誤 invalid literal for int() with base 10: 'a'
請輸入年齡:1111
發生年齡值不合法的錯誤, 年齡太大了
請輸入年齡:2
您輸入的年齡是:2

練習: 練習:寫一個函數getscore() 獲取學生輸入的成績(0~100),如果輸入出現異常,則用 try-except語句來處理異常並此函數返回0,如果一切正常則返回輸入的成績

def get_score():
score = int(input("輸入學生成績:"))
if score < 0:
raise ValueError("成績小於零")
if score > 100:
raise ValueError("成績大於零")
return score

while True:
try:
score = get_score()
break
except ValueError as err:
print("有錯誤發生:", err)

print("學生的成績是:", score)

輸入學生成績:-1
有錯誤發生:成績小於零
輸入學生成績:111
有錯誤發生:成績大於零
輸入學生成績:a
有錯誤發生:invalid literal for int() with base 10: 'a'
輸入學生成績:12
學生的成績是:12

4. python 調試器 pdb模塊

pdb是python debugger 調試器. 既可以在命令行執行python時進行調試,也可以作為模塊被調用.

python -m pdb mysqcript.py 則會進入調試模式

(Pdb) # 會自動停在第一行,等待調試

1. 功能
h (help) # 幫助, 列出可用命令, h command 可用查看具體命令
q (quit) # 退出
!statement # 在目前的環境中執行statement (就是執行指定python語句)。

alias name command # 以一個」別名」代替」一群出錯命令」,有點類似c/c++ 的 macro。可在.pdbrc文件內定義..

unalias name # 取消某個 alias定義的別名。
run # 重新運行腳本. 後面可以跟參數, 會覆蓋原來sys.argv保存的參數. 2.6後新加

2. 斷點設置
b lineno (break) # 斷點設置在本py的第 lineno 行, 或 b ots.py:20 #斷點設置到 ots.py第20行. b funcname #斷點設置到指定函數處; b # 查看所有斷點編號及信息

tbreak lineno # 臨時斷點, 用法同break, 但只能斷一次.

cl num (clear) # 刪除第 num 個斷點, num由b列出的Num列決定.如果沒有帶參數,則清除所有斷點。也可指定行號.

condition bpnumber [condition] # 設置斷點條件, 不寫條件則會取消條件設置.

disable bpnumber # 取消指定斷點的功能,但仍然保留斷點可以重新激活。不指定 bpnumber會失效暫停所有斷點.

enable bpnumber # 恢復斷點的功能。

ignore bpnumber count # 設定斷點的忽略次數。如果沒指定count,其初始為0。當count為0時,斷點會正常動作。若有指定 count,則每次執行到該中斷,count就少1,直到count數為0。

commands bpnumber # 設置斷點號處執行指定命令.使用該命令後進入cmd模式,然後可以輸入相關要執行的命令, 輸入end結束. 直接輸入end會取消相應號的命令. 2.5版新加

3. 運行
c (continue) # 繼續運行直到下個斷點
n (next) # 單步運行, 不會進入函數內部而是直接到下一行.
s (step) # 單步運行, 但會進入到調用函數的內部.
r (return) # 繼續執行直到函數返回處(return的地方).

j lineNo (jump) # 跳到某行執行,可以前跳或後跳。不是所有行都可跳. 只有在 call stack 的最底部才能作用。

unt (until) # 繼續執行直到行號大於當前行. ?? 2.6後新加.

4. 查看
l (list) # 列出目前所在檔案中的位置。->所指是現在所在代碼(一般是可執行代碼,默認上下5行). 連續的 l 命令會一直列到檔案結尾。指定一個數字參數 n, 就是列出該行上下文; 兩個參數n,m, 就是一個範圍(n<m) 或指定行及以後的m行.

p var (print) # 查看變量 var 當前值
pp 和 p 命令類似,但是使用 pprint module。
a (args) # 查看全部棧內當前函數的參數變量
w (where) 列出目前call stack 中的所在層。(調用棧中的處理)
d (down) 在call stack中往下移一層 (較新).
u (up) 在call stack中往上移一層(較舊)。如果在上移一層之後按下 n ,則會在上移之後的一層執行下一個敘述,之前的 function call 就自動返回。

import pdb

pdb.set_trace() : 設置斷點, 在運行腳本到此時進入pdb模式, 指令則指到下一行.
pdb.run(statement, globals=None, locals=None): 主要用於調試指定內容語句塊.
statement: 要調試的語句塊,以字符串的形式表示
globals: 可選參數,設置statement運行的全局環境變量
locals: 可選參數,設置statement運行的局部環境變量

pdb.runeval(statement, globals=None, locals=None): 和run類似, 但會對statement字符串先進行運算

pdb.runcall(funcname, *args, **kwds): 調試指定函數.後面可以指定傳遞的函數參數. 多參數要用,隔開.

pdb.post_mortem([traceback]): post-mortem調試模式處理traceback或新近的錯.

pdb.pm(): post-mortem調試模式處理sys.last_traceback 的反饋

相關焦點

  • python基礎---異常處理
    程序的異常處理今天霖小白心血來潮想來分享一下python基礎中的如何異常處理,使程序有更好的用戶體驗。前言python程序對用戶的輸入有一定的要求,所以當實際輸入不滿足程序要求時,可能在程序運行過程中會直接報錯無法進行下一步的運行。
  • Python 基礎知識整理 - 錯誤和異常(1)
    語法錯誤 語法錯誤,也稱為解析錯誤,可能是你在學習 Python 時遇到的最常見的抱怨: while True print('Hello world') 運行結果: C:\Python310>python
  • 十、python基礎之異常處理結構與程序調試方法
    實驗目的:學習python的異常處理和程序調試實驗環境:已正確安裝python3.51、異常的基本概念異常是指程序運行時引發的錯誤,得不到正確的處理將會導致程序終止運行合理地使用異常處理結構可以使得程序更加健壯,具有更強的容錯性。例如:最常見的除數為0,python會拋出「ZeroDivisionError"異常。
  • 【Python基礎】10 異常處理
    一 什麼是異常異常是程序發生錯誤的信號。程序一旦出現錯誤,便會產生一個異常,若程序中沒有處理它,就會拋出該異常,程序的運行也隨之終止。,在被檢測的代碼塊出現異常時,被檢測的代碼塊中異常發生位置之後的代碼將不會執行,取而代之的是執行匹配異常的except子代碼塊,其餘代碼均正常運行。
  • python入門——Python中異常處理
    python大數據課堂已經開始了。想轉行大數據,數據挖掘,機器學習,人工智慧的小夥伴可以關注啦。上一篇帶大家了解了python中的I/O函數。今天我們來繼續了解python中的異常處理。調試環境以python3.6環境為例。需要代碼和demo的朋友可以搜索「欒鵬全棧」到我的CSDN博客。
  • python異常處理筆記
    收錄於話題 #python基礎 7個
  • 【python學習】python的常見異常類
    盤庚即位後,自奄(今山東曲阜)遷都至殷(今河南安陽小屯),開墾荒地,長期定居下來。穩定的局面挽回了九世之亂以來商朝的衰落之勢。今天講python的標準異常類。有需要的也可以直接去我的github查看全部筆記:https://github.com/JackKoLing/python_notes_with_ten_days俗話說:「好記性不如爛筆頭」,多寫寫多記記,總不會錯。多一些不為什麼的堅持,少一些功利主義的追求。
  • 16-python中的異常
    通過前兩天的文章14-python中的函數,15-再敘python中的函數我們對python中有關函數的知識有了系統的認識和學習,今天我們將接著來看一下python中的異常。(一)Bug的由來和分類    "Bug"一詞的原意是"昆蟲"或"蟲子";而在電腦系統或程序中隱藏著的一些未被發現的缺陷或問題,人們也叫它"bug"。
  • Python異常處理
    問題描述大家在使用python語言寫代碼的時候難免會出一些錯誤,而才入門的朋友們往往不知道是哪裡出了錯或者不知道自己錯在哪裡、什麼錯誤。所以我們要知道是哪行代碼出錯,其次室錯誤的類型是什麼,錯在那個細節,逐步分析,從而解決錯誤並改正。
  • python中的異常捕獲
    無論是編程新手還是老手,都會遇到過程序報錯,終止執行的情況,對於python的報錯信息,可以分為以下兩大類語法錯誤,syntax error
  • python入門學習異常處理類型
    前言異常是指在程序執行過程中發生的一個事件,影響了程序的正常執行,例如:0做了分母。異常是Python對象,表示一個錯誤。當Python腳本發生異常時我們需要捕獲處理它,否則程序會終止執行。在Java語言中我們知道異常的常用結構為try catch組成,有時也會用到finally,那麼在python中異常是如何來處理的呢?python中的異常處理1.python異常簡單語法python異常的簡單語法為try-except-else語法,注意這裡的關鍵字是except而不是Exception,這與java是有區別的。
  • 【Python 第36課】 異常處理
    上面的錯誤可以避免,但在實際的應用中,有很多錯誤是開發者無法控制的,例如用戶輸入了一個不合規定的值,或者需要打開的文件不存在。這些情況被稱作「異常」,一個好的程序需要能處理可能發生的異常,避免程序因此而中斷。例如我們去打開一個文件:f = file('non-exist.txt')print 'File opened!'
  • 慢步學python,編程基礎知識,列表
    大家好,我百家號是:地鐵慢步,目前致力於python學習與分享。今天寫的是 python編程基礎知識: 列表python裡面最基礎的兩種數據類型是:數值和字符串。列表可以理解為一種數據結構。列,即有順序的隊列,有先後概念。
  • python面向對象之異常處理
    捕獲異常 2.1 簡單的捕獲異常語法 在程序開發中,如果 對某些代碼的執行不能確定是否正確,可以增加 `try(嘗試)` 來 捕獲異常 捕獲異常最簡單的語法格式:```pythontry: 嘗試執行的代碼except: 出現錯誤的處理``` `try
  • python基礎 | 條件 循環 異常 斷言
    python為我們提供了兩個循環控制關鍵字 break 和 continue 。二者區別就是break會終止循環,continue不終止循環。: print("捕獲到異常了!")捕獲到異常了!try: result = 4 / 2except ZeroDivisionError as reason: print(str(reason))else: print("沒有發生異常,輸出結果:%d" % result)finally: print("無論是否發生異常都會執行~")沒有發生異常,輸出結果:2無論是否發生異常都會執行~
  • 【Python雜貨鋪】速學python基礎
    「人生苦短,我學python」是編程屆的名言。用python寫小腳本的便捷性,讓很多其他語言的學習者把python當作輔助語言。擁有了某一個語言的功底,再來學習另外一種語言應該是十分快速的。編程理念都十分相似,只是看看語言的差異性。帶著Java的基礎,學習Python,準備上路了。
  • python 異常處理
    對於python來說,就是工廠類被具體工廠繼承。這樣在簡單工廠模式裡集中在工廠方法上的壓力可以由工廠方法模式裡不同的工廠子類來分擔。抽象的工廠類提供了一個創建對象的方法,也叫作工廠方法。1) 抽象工廠角色(Factory): 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的接口或者必須繼承的父類。
  • 一文搞懂Python錯誤和異常
    上面示例可以看到,針對語法錯誤,python解析器會輸出錯誤的那一行,並且在最先找到的錯誤的位置標記了一個箭頭。熟悉python語法後,可以避免語法錯誤,但是代碼常會發生異常(Exception)。Python用異常對象(exception object)來表示異常情況。
  • [Python]文件與異常的錯誤處理
    [Python]文件與異常的錯誤處理1.\env\Scripts\python.exe E:/Github/python/files_error/fileIO/fileIO.pyMan: 2.\env\Scripts\python.exe E:/Github/python/files_error/fileIO/fileIO.pyOther Man: I've told you once.
  • python學習筆記(9): try...except 異常捕獲
    目前正在學習python基礎,同時也在leetcode-cn上刷算法題目,有興趣的同學一起哦。最近學習了python如何處理異常,發現一篇比較好的文章,整理了一下,供大家學習研究。二、基礎語法捕捉異常可以使用tryexcept語句。如果你不想在異常發生時結束你的程序,只需在try裡捕獲它。