1. 程式人生 > >python全棧開發基礎【補充】異常處理

python全棧開發基礎【補充】異常處理

ret ror div 問題 條件 self. float 異常處理機制 有關

一、錯誤與異常

程序中難免會出現錯誤,而錯誤分為兩種

1.語法錯誤:(這種錯誤,根本過不了python解釋器的語法檢測,必須在程序執行前就改正)

2.邏輯錯誤:(邏輯錯誤),比如用戶輸入的不合適等一系列錯誤

那什麽是異常呢?

  異常就是程序運行時發生錯誤的信號,在python中,錯誤觸發的異常如下。異常發生之後,異常之後的代碼就不執行了

技術分享圖片

異常種類:在python中不同的異常可以用不同的類型(python中統一了類與類型,類型即類)去標識,

不同的類對象標識不同的異常,一個異常標識一種錯誤

常見的異常:

技術分享圖片

# 更多異常
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
ZeroDivisionError

  

二、異常處理

1.什麽是異常處理?      

python解釋器檢測到錯誤,觸發異常(也允許程序員自己觸發異常)

程序員編寫特定的代碼,專門用來捕捉這個異常(這段代碼與程序邏輯無關,與異常處理有關)

如果捕捉成功則進入另外一個處理分支,執行你為其定制的邏輯,使程序不會崩潰,這就是異常處理

2.為何要進行異常處理?

python解析器去執行程序,檢測到了一個錯誤時,觸發異常,異常觸發後且沒被處理的情況下,程序就在當前異常處終止,後面的代碼不會運行,誰會去用一個運行著突然就崩潰的軟件。

所以你必須提供一種異常處理機制來增強你程序的健壯性與容錯性

3.如何進行異常處理

首先須知,異常是由程序的錯誤引起的,語法上的錯誤跟異常處理無關,必須在程序運行前就修正

①使用if判斷

num1=input(‘>>: ‘) #輸入一個字符串試試
if num1.isdigit():
    int(num1) #我們的正統程序放到了這裏,其余的都屬於異常處理範疇
elif num1.isspace():
    print(‘輸入的是空格,就執行我這裏的邏輯‘)
elif len(num1) == 0:
    print(‘輸入的是空,就執行我這裏的邏輯‘)
else:
    print(‘其他情情況,執行我這裏的邏輯‘)

‘‘‘
問題一:
使用if的方式我們只為第一段代碼加上了異常處理,但這些if,跟你的代碼邏輯並無關系,這樣你的代碼會因為可讀性差而不容易被看懂

問題二:
這只是我們代碼中的一個小邏輯,如果類似的邏輯多,那麽每一次都需要判斷這些內容,就會倒置我們的代碼特別冗長。
‘‘‘

總結:

1.if判斷式的異常處理只能針對某一段代碼,對於不同的代碼段的相同類型的錯誤你需要寫重復的if來進行處理。

2.在你的程序中頻繁的寫與程序本身無關,與異常處理有關的if,會使得你的代碼可讀性極其的差

3.if是可以解決異常的,只是存在1,2的問題,所以,千萬不要妄下定論if不能用來異常處理。

②python為每一種異常定制了一個類型,然後提供了一種特定的語法結構用來進行異常處理

1.語法:

try:
     被檢測的代碼塊
except 異常類型:
     try中一旦檢測到異常,就執行這個位置的邏輯

2.異常類只能用來處理指定的異常情況,如果非指定異常則無法處理

s1 = ‘hello‘
try:
    int(s1)
except IndexError as e:
    print(e)<br>#沒有捕獲到異常,程序直接報錯

3.多分支

捕獲異常
num= input(‘num:>>‘)
try:
    f= open (‘file‘,‘w‘)
    # int(num)
    # l = []
    # l[10000]
    # 1 / 0
    # dic = {‘k‘: ‘v‘}
    # dic[‘k2‘]
    print(‘-----------‘)
except ValueError :
    print(‘請輸入一個數字‘)
except NameError as name_e:
    print(name_e)
    print(‘=======‘)
except IndentationError as name_e:
    print(name_e)
except IndexError as name_e:
    print(name_e)
except SyntaxError as name_e:
    print(name_e)
except ZeroDivisionError as name_e:
    print(name_e)
except AttributeError as name_e:
    print(name_e)
except KeyError as name_e:
    print(name_e)
# except Exception as e:
#     print(e,‘異常了‘)
else: #如果上面出現問題了,就不執行else,如果都正確了就會執行else裏的內容(支付過程可以用到else)
    print(‘else 被執行‘)
finally:  #不過這段代碼出沒出問題,都執行這裏的內容
    f.close()
print(‘finally‘)

4.萬能異常:可以捕獲任意異常

s1 = ‘hello‘
try:
    int(s1)
except Exception as e:
    print(e)

5.主動觸發異常

try:
    raise AttributeError(‘錯啦錯啦‘)
except AttributeError as e:
    print(e)

6.自定義異常

class EgonException(BaseException):
    def __init__(self,msg):
        self.msg = msg
    # def __str__(self):   可以不用寫這個方法,因為那個BaseException父類裏面已經實現了
    #     return self.msg
try:
    raise EgonException(‘egon出異常啦‘)
except EgonException as e:
    print(e)

7.斷言  

#斷言:一個會拋出異常的判斷,這個條件一旦成立就成立了,一旦不成立就報錯了,就都不執行下面的了
assert 1==2
if 1==2:
    print()
print(‘haha‘)

8.try..except的方式比較if的方式的好處

try..except這種異常處理機制就是取代if那種方式,讓你的程序在不犧牲可讀性的前提下增強健壯性和容錯性

異常處理中為每一個異常定制了異常類型(python中統一了類與類型,類型即類),對於同一種異常,一個except就可以捕捉到,可以同時處理多段代碼的異常(無需‘寫多個if判斷式’)減少了代碼,增強了可讀性

使用try..except的方式

1:把錯誤處理和真正的工作分開來
2:代碼更易組織,更清晰,復雜的工作任務更容易實現;
3:毫無疑問,更安全了,不至於由於一些小的疏忽而使程序意外崩潰了;

三、什麽時候用異常處理

try...except應該盡量少用,因為它本身就是你附加給你的程序的一種異常處理的邏輯,與你的主要的工作是沒有關系的

這種東西加的多了,會導致你的代碼可讀性變差,只有在有些異常無法預知的情況下,才應該加上try...except,

其他的邏輯錯誤應該盡量修正

  

python全棧開發基礎【補充】異常處理