在python開發中,代碼書寫時不免有疏忽或者意向不到的bug,致使程序run的過程當中有可能會直接崩潰;而後對於程序猿而言,程序因bug崩潰是屢見不鮮,爲了增長程序的健壯性,防止程序崩潰,咱們能夠對程序的有可能發生崩潰的代碼增長異常處理,以達到程序穩健運行的目的。python
通常狀況,python沒法正常處理程序時,就是會產生異常,舉個例子:git
1.你們都知道分母不能爲0,若是分母爲0,程序必然崩潰;github
1微信 2ide 3函數 |
x = 3/0編碼
程序崩潰/報錯:ZeroDivisionError: division by zerospa |
2.假如 python文件讀寫 中,咱們講解了文件的讀寫操做,若是咱們對一個不存在的文件讀取內容,程序必然也會崩潰;操作系統
1code 2 3 4 |
# 讀取123.txt文件,實際上該文件並不存在 fp =open("123.txt","r")
程序崩潰/報錯:FileNotFoundError: [Errno 2] No such file or directory: '123.txt' |
對於以上的各類異常狀況,咱們能夠經過 try…except…解決,那麼具體有哪些異常能捕獲呢?以下所示:
1.BaseException — 全部異常的基類
2.SystemExit — 解釋器請求退出
3.KeyboardInterrupt — 用戶中斷執行(一般是輸入^C)
4.Exception — 常規錯誤的基類
5.StopIteration — 迭代器沒有更多的值
6.GeneratorExit — 生成器(generator)發生異常來通知退出
7.StandardError — 全部的內建標準異常的基類
8.ArithmeticError — 全部數值計算錯誤的基類
9.FloatingPointError — 浮點計算錯誤
10.OverflowError — 數值運算超出最大限制
11.ZeroDivisionError — 除(或取模)零 (全部數據類型)
12.AssertionError — 斷言語句失敗
13.AttributeError — 對象沒有這個屬性
14.EOFError — 沒有內建輸入,到達EOF 標記
15.EnvironmentError — 操做系統錯誤的基類
16.IOError — 輸入/輸出操做失敗
17.OSError — 操做系統錯誤
18.WindowsError — 系統調用失敗
19.ImportError — 導入模塊/對象失敗
20.LookupError — 無效數據查詢的基類
21.IndexError — 列中沒有此索引(index)
22.KeyError — 映射中沒有這個鍵
23.MemoryError — 內存溢出錯誤(對於Python 解釋器不是致命的)
24.NameError — 未聲明/初始化對象 (沒有屬性)
25.UnboundLocalError — 訪問未初始化的本地變量
26.ReferenceError — 弱引用(Weak reference)試圖訪問已經垃圾回收了的對象
27.RuntimeError — 通常的運行時錯誤
28.NotImplementedError — 還沒有實現的方法
29.SyntaxError — Python 語法錯誤
30.IndentationError — 縮進錯誤
31.TabError — Tab 和空格混用
32.SystemError — 通常的解釋器系統錯誤
33.TypeError — 對類型無效的操做
34.ValueError — 傳入無效的參數
35.UnicodeError — Unicode 相關的錯誤
36.UnicodeDecodeError — Unicode 解碼時的錯誤
37.UnicodeEncodeError — Unicode 編碼時錯誤
38.UnicodeTranslateError — Unicode 轉換時錯誤
39.Warning — 警告的基類
40.DeprecationWarning — 關於被棄用的特徵的警告
41.FutureWarning — 關於構造未來語義會有改變的警告
42.OverflowWarning — 舊的關於自動提高爲長整型(long)的警告
43.PendingDeprecationWarning — 關於特性將會被廢棄的警告
44.RuntimeWarning — 可疑的運行時行爲(runtime behavior)的警告
45.SyntaxWarning — 可疑的語法的警告
46.UserWarning — 用戶代碼生成的警告
1 2 3 4 |
try: <代碼> except: print("異常說明") |
示例代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解憂 @Blog(我的博客地址): shuopython.com @WeChat Official Account(微信公衆號):猿說python @Github:www.github.com
@File:try_except.py @Time:2019/10/9 21:27
@Motto:不積跬步無以致千里,不積小流無以成江海,程序人生的精彩須要堅持不懈地積累! """
try: x = 3 / 0 # 程序出現異常,不會繼續執行後面的代碼 print("hello world") except: print("異常說明:分母不能爲0")
print("程序正常結束") |
輸出結果:
1 2 |
異常說明:分母不能爲0 程序正常結束 |
1 2 3 4 |
try: < 語句 > except < 異常名 >: print('異常說明') |
示例代碼:
1 2 3 4 5 6 7 8 |
try: fp = open("123.txt","r") # 程序出現異常,不會繼續執行後面的代碼 print("hello world") fp.close() except IOError: print("異常說明:文件讀取失敗")
print("程序正常結束") |
輸出結果:
1 2 |
異常說明:文件讀取失敗 程序正常結束 |
1 2 3 4 5 6 7 8 |
try: < 語句 > except < 異常名1 >: print('異常說明1') except < 異常名2 >: print('異常說明2') except < 異常名3 >: print('異常說明3') |
該種異常處理語法的規則是:
a.執行try下的語句,若是引起異常,則執行過程會跳到第一個except語句。
b.若是第一個except中定義的異常名與引起的異常匹配,則執行該except中的語句。
c.若是引起的異常不匹配第一個except,則會搜索第二個except,容許編寫的except數量沒有限制。
d.若是全部的except都不匹配,則異常會傳遞到下一個調用本代碼的最高層try代碼中。
示例代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
try: fp = open("123.txt","r") # 程序出現異常,不會繼續執行後面的代碼 print("hello world") fp.close() except GeneratorExit: print("異常說明:GeneratorExit") except FloatingPointError: print("異常說明:FloatingPointError") except OverflowError: print("異常說明:OverflowError") except ZeroDivisionError: print("異常說明:ZeroDivisionError") except IOError: print("異常說明:IOError")
print("程序正常結束") |
輸出結果:
1 2 |
異常說明:IOError 程序正常結束 |
1 2 3 4 |
try: < 語句 > except Exception as e: # 自動識別異常信息,並將異常信息保存在e中 print('異常說明:',e) |
示例代碼:
1 2 3 4 5 6 7 8 |
try: fp = open("python.txt","r") # 程序出現異常,不會繼續執行後面的代碼 print("hello world") fp.close() except Exception as e: print("異常說明:",e)
print("程序正常結束") |
輸出結果:
1 2 |
異常說明: [Errno 2] No such file or directory: 'python.txt' 程序正常結束 |
若是判斷完沒有異常以後還想作其餘事,就可使用下面這樣的else語句,注意:是在try中沒有異常狀況下,纔會執行else以後的代碼。
1 2 3 4 5 6 7 8 |
try: < 語句 > except < 異常名1 >: print('異常說明1') except < 異常名2 >: print('異常說明2') else: < 語句 > # try語句中沒有異常則執行此段代碼 |
示例代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
try: print("hello world") except GeneratorExit: print("異常說明:GeneratorExit") except FloatingPointError: print("異常說明:FloatingPointError") except OverflowError: print("異常說明:OverflowError") except ZeroDivisionError: print("異常說明:ZeroDivisionError") else: print("i love you")
print("程序正常結束") |
輸出結果:
1 2 3 |
hello world i love you 程序正常結束 |
try…finally…語句不管是否發生異常都將會執行最後的代碼。
1 2 3 4 |
try: < 語句 > finally: < 語句 > |
示例代碼:
1 2 3 4 5 6 7 8 9 10 |
try: fp = open("python.txt","r") # 程序出現異常,不會繼續執行後面的代碼 print("hello world") fp.close() except Exception as e: print("異常說明:",e) finally: print("finally") # 不管是否發生異常都將會執行最後的代碼
print("程序正常結束") |
輸出結果:
1 2 3 |
異常說明: [Errno 2] No such file or directory: 'python.txt' finally 程序正常結束 |
可使用raise語句本身觸發異常,語法以下:
1 |
raise [Exception [, args [, traceback]]] |
語句中 Exception 是異常的類型(例如,IOError )參數標準異常中任一種,args 是自已提供的異常參數。最後一個參數是可選的(在實踐中不多使用),若是存在,是跟蹤異常對象;示例代碼以下:
1 2 3 4 5 6 7 |
try: raise Exception("raise Exception!") # 觸發異常後,後面的代碼就不會再執行 print("hello world") except Exception as e: print(e) finally: print("OK") |
輸出結果:
1 2 |
raise Exception! OK |
在python開發中,爲了增長程序的健壯性,異常處理try…except…是必須掌握的內容.
轉載請註明:猿說Python » python異常處理