python異常處理:try_except語句;try_finally語句;raise語句


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 用戶代碼生成的警告

1、try-except語句

2、try-finally語句

3、raise語句

參考:

小甲魚Python第032講:異常處理:你不可能總是對的| 課后測試題及參考答案

小甲魚Python第033講:異常處理:你不可能總是對的2| 課后測試題及參考答案

一、try-except語句

語句格式:

try:
    檢測范圍
except Exception [as reason]:
    出現異常(Exception)后的處理代碼
try:
<語句>        #運行別的代碼
except <名字><語句>        #如果在try部份引發了'name'異常
except <名字>,<數據>:
<語句>        #如果引發了'name'異常,獲得附加的數據
else:
<語句>        #如果沒有異常發生

  try的工作原理是,當開始一個try語句后,python就在當前程序的上下文中作標記,這樣當異常出現時就可以回到這里,try子句先執行,接下來會發生什么依賴於執行時是否出現異常。

  • 如果當try后的語句執行時發生異常,python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。
  • 如果在try后的語句里發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層(這樣將結束程序,並打印默認的出錯信息)。
  • 如果在try子句執行時沒有發生異常,python將執行else語句后的語句(如果有else的話),然后控制流通過整個try語句。

實例

  下面是簡單的例子,它打開一個文件,在該文件中的內容寫入內容,且並未發生異常:

try:
    fh = open("testfile", "w")
    fh.write("這是一個測試文件,用於測試異常!!")
except IOError:
    print ("Error: 沒有找到文件或讀取文件失敗")
else:
    print ("內容寫入文件成功")
    fh.close()

  try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理。

  如果你不想在異常發生時結束你的程序,只需在try里捕獲它。eg:

f = open("我為什么是一個文檔.txt")
print(f.read())
f.close()

  以上代碼在“我為什么是一個文檔.txt”這個文檔不存在的時候,Python就會報錯說文件不存在:

Traceback (most recent call last):
  File "C:\Users\14158\Desktop\lalallalalal.py", line 1, in <module>
    f = open("我為什么是一個文檔.txt")
FileNotFoundError: [Errno 2] No such file or directory: '我為什么是一個文檔.txt'

  顯然這樣的用戶體驗很糟糕,因此可以這樣修改:

try:
      f = open("我為什么是一個文檔.txt")
      print(f.read())
      f.close()
except OSError:
      print("文件打開的過程出錯啦")

  但是從程序員的角度來看,導致OSError異常的原因有很多(例如FileExistsError、FileNotFoundError等等),所以可能會更在意錯誤的具體內容,這里可以使用as把具體的錯誤信息給打印出來:

try:
      f = open("我為什么是一個文檔.txt")
      print(f.read())
      f.close()
except OSError as reason:
      print("文件打開的過程出錯啦,錯誤的原因是:" + str(reason))
文件打開的過程出錯啦,錯誤的原因是:[Errno 2] No such file or directory: '我為什么是一個文檔.txt'

1、針對不同異常設置多個except

  你可以不帶任何異常類型使用except,如下實例:

try:
    正常的操作
   ......................
except:
    發生異常,執行這塊代碼
   ......................
else:
    如果沒有異常執行這塊代碼

  以上方式try-except語句捕獲所有發生的異常。但這不是一個很好的方式,我們不能通過該程序識別出具體的異常信息。因為它捕獲所有的異常。

  一個try語句還可以和多個except語句搭配,分別對感興趣的異常進行檢測處理:

try:
      sum = 1 + '1'
      f = open("我是一個不存在的文檔.txt")
      print(f.read())
      f.close()
except OSError as reason:
      print("文件打開的過程出錯啦,錯誤的原因是:" + str(reason))
except TypeError as reason:
      print("文件打開的過程出錯啦,錯誤的原因是:" + str(reason))
文件打開的過程出錯啦,錯誤的原因是:unsupported operand type(s) for +: 'int' and 'str'

2、對多個異常統一處理

標准語句:

try:
    正常的操作
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   發生以上多個異常中的一個,執行這塊代碼
   ......................
else:
    如果沒有異常執行這塊代碼

  except后邊還可以跟多個異常,然后對這些異常進行統一的處理:

try:
      int("abc")
      sum = 1 + "1"
      f = open("我是一個不存在的文檔.txt")
      print(f.read())
      f.close()
except (OSError,TypeError):
      print("文件打開的過程出錯啦,錯誤的原因是:" + str(reason))
Traceback (most recent call last):
  File "C:\Users\14158\Desktop\lalallalalal.py", line 2, in <module>
    int("abc")
ValueError: invalid literal for int() with base 10: 'abc'

3、捕獲所有的異常

如果你無法確定要對哪一類異常進行處理,只是希望在try語句塊里一旦出現異常,可以給用戶一個“看得懂”的提醒,那么可以這么做。

............

except:

  print("出錯了~")

............

不過通常不建議這么做,因為它會隱藏所有程序員未想到並且未做好處理准備的錯誤,例如當用戶輸入ctrl+C試圖終止程序,卻被解釋為KeyboardInterrupt異常。另外要注意的是,try語句檢測范圍內一旦出現異常,剩下的語句將不會執行。

二、try-finally語句

  try-finally 語句無論是否發生異常都將執行最后的代碼。

try:
<語句>
finally:
<語句>    #退出try時總會執行
raise  

  如果“我是一個不存在的文檔”確實存在,open()函數正常返回文件對象,但異常卻發生在成功打開文件后的sum = 1 + “1”語句上。此時python將直接跳轉到except語句,也就是說,文件被打開了,但並沒有執行關閉的命令:

 

try:
      f = open("我是一個不存在的文檔.txt")
      print(f.read())
      sum = 1 + "1"
      f.close()
except:
      print("出錯啦")

 

  為了實現像這種“就算出現異常,但不得不執行的收尾工作(比如在程序崩潰前保存用戶文檔)”,引入了finally來擴展try:

 

 

try:
      f = open("我是一個不存在的文檔.txt")
      print(f.read())
      sum = 1 + "1"
except:
      print("出錯啦")
finally:
      f.close()

 

  如果try語句塊中沒有出現任何運行時出現的錯誤,會跳過except語句執行finally語句塊的內容。如果出現異常,則會先執行except語句塊的內容再執行finally語句塊的內容。總之,finally語句塊中的內容就是確保無論如何都將被執行的內容。

try:
    fh = open("testfile", "w")
    try:
        fh.write("這是一個測試文件,用於測試異常!!")
    finally:
        print ("關閉文件")
        fh.close()
except IOError:
    print ("Error: 沒有找到文件或讀取文件失敗")

  當在try塊中拋出一個異常,立即執行finally塊代碼。finally塊中的所有語句執行后,異常被再次觸發,並執行except塊代碼。參數的內容不同於異常。

 

 

三、raise語句

raise語法格式如下:

raise [Exception [, args [, traceback]]]

  語句中 Exception 是異常的類型(例如,NameError)參數標准異常中任一種,args 是自已提供的異常參數。最后一個參數是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。

  也許會問,我的代碼能不能自己拋出一個異常呢?答案是可以的,可以使用raise語句拋出一個異常:

>>> raise ZeroDivisionError
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    raise ZeroDivisionError ZeroDivisionError

  拋出的異常還可以帶參數,表示異常的解釋:

>>> raise ZeroDivisionError("除數不能為零!")
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    raise ZeroDivisionError("除數不能為零!") ZeroDivisionError: 除數不能為零!

eg:

  一個異常可以是一個字符串,類或對象。 Python的內核提供的異常,大多數都是實例化的類,這是一個類的實例的參數。定義一個異常非常簡單,如下所示:

def functionName( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # 觸發異常后,后面的代碼就不會再執行

注意:為了能夠捕獲異常,"except"語句必須有用相同的異常來拋出類對象或者字符串。例如我們捕獲以上異常,"except"語句如下所示:

try:
    正常邏輯
except Exception,err:
    觸發自定義異常    
else:
    其余代碼

eg:

# 定義函數
def mye( level ):
    if level < 1:
        raise Exception,"Invalid level!"
        # 觸發異常后,后面的代碼就不會再執行
try:
    mye(0)            # 觸發異常
except Exception,err:
    print 1,err
else:
    print 2

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM