1. 程式人生 > >Python的異常和異常處理----17

Python的異常和異常處理----17

異常

  • 錯誤和異常
  • 錯誤指的是可以人為避免的
  • 異常是指在語法邏輯正確的情況下,出現問題
  • 在Python中,異常是一個類,可以處理和使用
  • 異常的分類
              BaseException    所有異常的基類
              SystemExit    直譯器請求退出
              KeyboardInterrupt    使用者中斷執行(通常是輸入^C)
              Exception    常規錯誤的基類
              StopIteration    迭代器沒有更多的值
              GeneratorExit    生成器(generator)發生異常來通知退出
              StandardError    所有的內建標準異常的基類
              ArithmeticError    所有數值計算錯誤的基類
              FloatingPointError    浮點計算錯誤
              OverflowError    數值運算超出最大限制
              ZeroDivisionError    除(或取模)零 (所有資料型別)
              AssertionError    斷言語句失敗
              AttributeError    物件沒有這個屬性
              EOFError    沒有內建輸入,到達EOF 標記
              EnvironmentError    作業系統錯誤的基類
              IOError    輸入/輸出操作失敗
              OSError    作業系統錯誤
              WindowsError    系統呼叫失敗
              ImportError    匯入模組/物件失敗
              LookupError    無效資料查詢的基類
              IndexError    序列中沒有此索引(index)
              KeyError    對映中沒有這個鍵
              MemoryError    記憶體溢位錯誤(對於Python 直譯器不是致命的)
              NameError    未宣告/初始化物件 (沒有屬性)
              UnboundLocalError    訪問未初始化的本地變數
              ReferenceError    弱引用(Weak reference)試圖訪問已經垃圾回收了的物件
              RuntimeError    一般的執行時錯誤
              NotImplementedError    尚未實現的方法
              SyntaxError    Python 語法錯誤
              IndentationError    縮排錯誤
              TabError    Tab 和空格混用
              SystemError    一般的直譯器系統錯誤
              TypeError    對型別無效的操作
              ValueError    傳入無效的引數
              UnicodeError    Unicode 相關的錯誤
              UnicodeDecodeError    Unicode 解碼時的錯誤
              UnicodeEncodeError    Unicode 編碼時錯誤
              UnicodeTranslateError    Unicode 轉換時錯誤
              Warning    警告的基類
              DeprecationWarning    關於被棄用的特徵的警告
              FutureWarning    關於構造將來語義會有改變的警告
              OverflowWarning    舊的關於自動提升為長整型(long)的警告
              PendingDeprecationWarning    關於特性將會被廢棄的警告
              RuntimeWarning    可疑的執行時行為(runtime behavior)的警告
              SyntaxWarning    可疑的語法的警告
              UserWarning    使用者程式碼生成的警告
    

異常處理

  • 不能保證程式碼永遠正確執行
  • 但是,必須保證程式在最壞的情況下得到的問題被妥善處理
  • Python的異常處理模組全部語法為:
                      try:
                      <語句>        #執行別的程式碼
                      except <名字>:
                      <語句>        #如果在try部份引發了'name'異常
                      expect (異常型別1,異常型別2,...)
                          解決多個異常使用相同的處理
                      except <名字>,<資料>:
                      <語句>        #如果引發了'name'異常,獲得附加的資料
                      else:
                      <語句>        #如果沒有異常發生
                      finally:
                      不管有沒有異常都要執行的程式碼
    
  • 流程
    1. 執行try下面的語句
    2. 如果出現異常,則在except語句中查詢對應的異常並進行相應的處理
    3. 如果沒有出現異常,則執行else語句內容
    4. 最後,不管是否出現異常,都要執行finally語句
  • 除except(最少一個)以外,else和finally可選

In [12]:

 

# 簡單案例
try:
    num = int(input('Please input your number:'))
    rst = 100 / num
    print('估計結果是:{0}'.format(rst))
except:
    print('輸入錯誤')
    #exit 是退出程式的意思
    exit()
Please input your number:0
輸入錯誤

In [1]:

 

 
# 簡單案例
#給出提示資訊
try:
    num = int(input('Please input your number:'))
    rst = 100 / num
    print('估計結果是:{0}'.format(rst))
    #捕獲異常資訊,把異常例項化
    #以下語句是捕獲ZeroDivisionError異常並例項化例項
except ZeroDivisionError as e:
    print(e)
    #exit 是退出程式的意思
    exit()
Please input your number:0
division by zero

In [1]:

 

 
# 簡單案例
#給出提示資訊
try:
    num = int(input('Please input your number:'))
    rst = 100 / num
    prnt('估計結果是:{0}'.format(rst))
#如果是多種error的情況
#需要把越具體的錯誤,越往前放
#在處理異常的時候,一旦攔截到某一個異常,則不在繼續往下查,直接進行下一個程式碼
#即有finally則執行finally語句塊,否則執行下一個大的語句塊   
except ZeroDivisionError as e:
    print(e)
    #exit 是退出程式的意思
except NameError as e:
    print('名字錯了')
    print(e)
#所有錯誤都繼承自Exception
#出現那種錯誤都會攔截
#而且這段程式碼一定是最後一個except
except Exception as e:
    print('不知道錯哪')
    exit()
print('hahahah')
Please input your number:aa
不知道錯哪
hahahah

使用者手動引發異常

  • 某些情況,使用者希望自己引發一個異常
  • raise 關鍵字來引發異常

In [2]:

 

#raise案例--1
try :
    print('hahahaha')
    print(3.123445)
    #手動引發異常
    #注意語法:raise ErrorClassName
    raise ValueError #手動觸點發ValueError
    print('還沒結束')
except NameError as e:
    print('NameError')
except ValueError as e:
    print('ValueError')
except Exception as e:
    print('不知道錯哪')
finally:
    print('我執行了')
hahahaha
3.123445
ValueError
我執行了

In [8]:

 

 
#raise案例--2
#自己定義異常
#注意:自定義異常必須是系統異常的子類
class DanaValueError(ValueError):
    pass
try :
    print('hahahaha')
    print(3.123445)
    #手動引發異常
    #注意語法:raise ErrorClassName
    raise DanaValueError #手動觸點發ValueError
    print('還沒結束')
except NameError as e:
    print('NameError')
except DanaValueError as e:
    print('是大拿錯了')
except ValueError as e:
    print('ValueError')
except Exception as e:
    print('不知道錯哪')
finally:
    print('我執行了')
hahahaha
3.123445
是大拿錯了
我執行了

In [11]:

 

# else語句案例
try:
    num = int(input('Please input your number:'))
    rst = 100 / num
    print('估計結果是:{0}'.format(rst))
except Exception as e:
    print('不知道錯哪')
else :
    print('沒有錯誤')
finally:
    print('執行了')
Please input your number:20
估計結果是:5.0
沒有錯誤
執行了

關於自定義的異常

  • 只要是raise異常,則推薦自定義
  • 在自定義異常的時候,一般包含以下內容:
    • 自定義發生異常的程式碼
    • 自定義發生異常後的問題提示
    • 自定義發生異常的行數
  • 目的:程式碼發生錯誤時,方便程式設計師找錯