Python穩基修煉之異常處理

錯誤與異常

一、區分錯誤與異常

兩種錯誤(都必須改正): 語法錯誤(代碼不規範,格式不對或缺乏符號)、邏輯錯誤(邏輯不通)
異常: 程序運行時發生錯誤的信號git

二、異常處理與注意事項

異常處理: 程序員特地去捕捉異常,若是捕捉成功,就進入另一段你定義的邏輯裏去運行,使程序不會崩潰程序員

注意: 異常處理的邏輯應該是與程序的主邏輯的分離開的;根本不會有人去用運行到一半就崩潰的軟件,因此咱們必須提供一種異常處理機制來加強咱們程序的健壯性和容錯性markdown

各類異常

一、常見異常

AttributeError 試圖訪問一個對象沒有的屬性,好比test.a,可是test沒有屬性a
IOError 輸入/輸出異常;基本上就是沒法打開文件
ImportError 沒法引入模塊或包;基本上就是路徑問題或名稱錯誤
IndentationError 語法錯誤(的子類) ;代碼沒有正確縮進或對齊
IndexError 下標索引超出序列邊界,好比當a只有三個元素,卻試圖訪問a[5]
KeyError 鍵異常,試圖訪問字典裏不存在的鍵
KeyboardInterrupt Ctrl+C被按下
NameError 使用一個還未被賦予對象的變量
SyntaxError Python代碼非法,代碼不能編譯(基本上就是語法錯誤)
TypeError 傳入對象類型與要求的不符合
UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是因爲另有一個同名的全局變量,致使你覺得正在訪問它
ValueError 值異常,傳入一個調用者不指望的值,即便值的類型是正確的ui

二、其餘異常

ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionErrorspa

這些異常都比較少見,因此也沒有必要所有列出來是哪方面的異常,太多了也記不住,因此能夠遇到再去搜索這些少見的異常的解決方案3d

異常處理

一、if判斷式

while True:
    cou = input('請輸入你的帳號:\n')
    if cou.isdigit():  #主邏輯,若是全是數字才執行轉換int格式操做
        int(cou)
        break
    #下面幾個就爲異常準備的邏輯,在寫程序時就應該考慮到各類可能出現的異常
    elif cou.isspace():  
        print('帳號內不該有空格,請從新輸入')
        continue
    elif len(cou)==0:
        print('您輸入的長度爲0,請從新輸入')
    elif cou.isalpha():
        print('帳號內不該有字母,請從新輸入')
    else:
        print('輸入內有其餘非法輸入,請從新輸入')
123456789101112131415
複製代碼

運行結果:
if判斷式
if判斷式的缺點: 只能針對某一段代碼,對於不一樣的代碼段的相同錯誤類型需須要寫重複的if來進行處理,顯得很是贅餘,可讀性極其差code

二、try … except …異常處理

while True:
    try:  #主邏輯
        cou = input('請輸入數字:\n')
        int(cou)

        cou2 = input('請再輸入數字:\n')
        int(cou2)

    except ValueError as e:
        #ValueError是異常類型,表示若是出現值的異常,就執行except下的邏輯
        print(e,'請從新輸入')
    except KeyError as e:  #若是出現鍵的異常
        print(e,'請從新輸入')
    except IndexError as e:  #若是出現語法異常
        print(e,'請從新輸入')
    except Exception as e:  #若是出現其餘異常
        print(e,'請從新輸入')

    else:
        print('try內的代碼沒有異常就執行else')  #沒有異常就會執行else的內容

    finally:
        print('不管try中有無異常,finally都會執行')
        break  #經常使用來作清理內存操做,或者跳出循環
123456789101112131415161718192021222324
複製代碼

運行結果:
exectp異常處理regexp

三、主動異常

name = 'ViewIn'
try:
    raise TypeError('類型錯誤')  #用raise主動觸發異常
except Exception as e:
    print(e)
12345
複製代碼

運行結果:
主動異常對象

四、斷言

print('---------------------------line1')
assert 1 == 1
print('===========================line2')  #若是assert的表達式成立,則繼續執行,不然程序終止

#至關於
if 1 != 2:
    raise AssertionError  #主動拋出一個異常

#斷言後面有一萬行代碼
123456789
複製代碼

運行結果:
斷言blog

 交流基地:630390733
相關文章
相關標籤/搜索