Python 基礎之面向對象之異常處理

.認識異常

1.經常使用異常報錯的錯誤類型

IndexError                索引超出序列的範圍函數

KeyError                  字典中查找一個不存在的關鍵字測試

NameError                 嘗試訪問一個不存在的變量編碼

IndentationError          縮進錯誤spa

AttributeError            嘗試訪問未知的對象屬性操作系統

StopIteration             迭代器沒有更多的值code

AssertionError  斷言語句(assert)失敗對象

EOFError                  用戶輸入文件末尾標誌EOF(Ctrl+d)繼承

FloatingPointError        浮點計算錯誤索引

GeneratorExit             generator.close()方法被調用的時候進程

ImportError               導入模塊失敗的時候

KeyboardInterrupt         用戶輸入中斷鍵(Ctrl+c)

MemoryError               內存溢出(可經過刪除對象釋放內存)

NotImplementedError       還沒有實現的方法

OSError                   操做系統產生的異常(例如打開一個不存在的文件)

OverflowError             數值運算超出最大限制

ReferenceError   弱引用(weak reference)試圖訪問一個已經被垃圾回收機制回收了的對象

RuntimeError              通常的運行時錯誤

SyntaxError               Python的語法錯誤

TabError                  Tab和空格混合使用

SystemError               Python編譯器系統錯誤

SystemExit                Python編譯器進程被關閉

TypeError                 不一樣類型間的無效操做

UnboundLocalError         訪問一個未初始化的本地變量(NameError的子類)

UnicodeError              Unicode相關的錯誤(ValueError的子類)

UnicodeEncodeError        Unicode編碼時的錯誤(UnicodeError的子類)

UnicodeDecodeError        Unicode解碼時的錯誤(UnicodeError的子類)

UnicodeTranslateError     Unicode轉換時的錯誤(UnicodeError的子類)

ValueError                傳入無效的參數

ZeroDivisionError         除數爲零

2.較常見的報錯進行舉例

# (1)IndexError   索引超出序列的範圍
# lst = [1,2,3,4,5]
# res = lst[999]

# (2)KeyError 字典中查找一個不存在的關鍵字
dic = {'a':1,'b':2,'c':3}
# print(dic["d"])

# (3)NameError  嘗試訪問一個不存在的變量
#print(hhh)

# (4)IndentationError  縮進錯誤
if 5 == 5:
    print(55)
  # print(444)


# (5)AttributeError  嘗試訪問位置的對象屬性
class MyClass():
    a = 5
    b = 6
obj = MyClass()
#obj.c


# (6)StopIteration  迭代器沒有更多的值
it = iter(range(3))
for i in it:
    print(i)
#res = next(it)

# (7)AssertionError 斷言語句(assert) 失敗
'''
#猜一猜 3大於1 嗎? 若是3大於1
# 若是猜錯了,直接拋異常
# 通常用在程序測試中
'''
#assert 3<1

"""
if 3<1:
   print("成立")

"""

.異常處理基本語法

#格式:
try:
    code1
    code2
    ...
except:
    code1
    code2

把有可能出現異常的代碼放到try這個代碼塊當中
若是出現了異常錯誤,直接走execpt這個代碼塊

1.異常處理基本語法

##例1:
try:
    lst = [1, 2, 3, 4]
    print(lst[9999]) #由於沒有9999的列表全部,全部程序有錯誤
except:
    print("這個程序有錯誤")
    # pass

2.多分支條件的異常處理

execpt + 異常錯誤類 特指這種異常錯誤發生時,走該分支

#例2:
try:
    #如下(1)(2)(3)一一對應,把一一對應的註釋去掉別的將其註釋就會到想要的數字程序走
    #(1)
    # lst = [1,2,3,45,6]
    # print(lst[10])
    
    #(2)
    # dic = {'a':1}  
    # print(dic['b'])
    
    #(3)
    print(hh)
except IndexError:
    #(1)
    print("走到這裏,說明報的是索引下標越界錯誤.")
except KeyError:
    #(2)
    print("走到這裏,說明報的是字典的鍵出現錯誤")

except:
    #(3)
    # 條件都不知足,走except分支
    print("程序有錯誤")

3.處理迭代器越界錯誤

藉助異常處理類,接收生成器函數中的return 返回值
##例3:
def mygen():
    yield 1
    yield 2
    return 3
# 實例化生成器函數 產生生成器對象 簡稱生成器
gen1 = mygen()
try:
    res = next(gen1)
    res = next(gen1)
    res = next(gen1) # yield只有兩次,全部第三次調用報錯
    print(res)
# as 及時用來起名字的,給StopIteration 的類[對象]起名字
except StopIteration as e:
    '''
    當咱們打印對象的時候,觸發__str__魔術方法
    在StopIteration 這個類當中,自動接收異常return 的返回值
    經過打印對象觸發__str__方法,進而把返回值打印出來
    '''
    print(e)

 

三.主動拋出異常raise

BaseExcepton 是全部異常類的父類(基類,超類) (子類的別名: 衍生類 派生類)
Exception    是全部普通錯誤處理類的父類
raise + (異常處理類  異常處理的對象)
#格式:
try:
    raise
except:
    pass


#返回時True .Exception 是 BaseException 的子類
res = issubclass(Exception, BaseException)
print(res)

1.raise 語法的基本格式

#完整寫法
try:
    #必須嵌入在try 這個代碼裏面使用
    raise BaseException
except:
    print("這個程序拋出了異常")

#簡寫寫法
'''
try:
    raise
except:
    print("程序拋出了異常")

'''

2.自定義異常類

# return_errorinfo 必需要依靠異常的形式才能觸發獲取當前的行號或者文件名
def return_errorinfo(n):
    import sys
    f = sys.exc_info()[2].tb_frame.f_back
    if n == 1:
        return str(f.f_lineno)  # 返回當前行數
    elif n == 2:
        return f.f_code.co_filename  # 返回文件名

def get_info(n):
    try:
        raise BaseException
    except:
        return return_errorinfo(n)

#若是想要自定義異常類,必須繼承全部異常的父類BaseException
class MyException(BaseException):
    def __init__(self, err_num, err_msg, err_line, err_filename):
        #打印錯誤號
        self.err_num = err_num
        #打印錯誤信息
        self.err_msg = err_msg
        #打印錯誤的行號
        self.err_line = err_line
        #打印錯誤文件
        self.err_filename = err_filename

human_sex = "中性"

try:
    if human_sex == "中性":
        raise MyException(1001, "人類沒有中性", get_info(1), get_info(2))
except MyException as e:
    #打印錯誤號
    print(e.err_num)
    #打印錯誤信息
    print(e.err_msg)
    #打印錯誤的行號
    print(e.err_line)
    #打印錯誤文件
    print(e.err_filename)

 

3.try ... finally .... 使用

try:
    print(name)
#不管是否報錯,都會執行finally裏面代碼塊
finally:
    pass
若是有一些語句,計算在發送報錯的狀況也仍然要調用或處理一些邏輯
那麼使用finally

#例:
# try:
#     print(name)
#
# finally:
#     print(123)
#     print(456)


try這個代碼塊若是有錯誤,不執行else代碼中的內容
若是沒有報錯,那麼執行else代碼塊中的內容
try ... execpt ... else 要配合使用else 不能單獨拿出來和try使用.
try ... finally .... 能夠配合在一塊兒使用

4.try ... execpt ... else使用

try:    #print(name)    print(123)except:    passelse:    print(789)

相關文章
相關標籤/搜索