天天看點

python異常處理 異常裝飾器 抛出異常 斷言

一、異常處理

1.什麼是異常?

程式在運作過程中出現了不可預知的錯誤

并且該錯誤沒有對應的處理機制,那麼就會以異常的形式表現出來

造成的影響就是整個程式無法再正常運作

2.異常的結構:

          類型   資訊   位置

3.異常的種類

1.文法錯誤

是你程式立刻就能解決的,這種錯誤是不能被容忍的

文法上的錯誤 發現之後應該立刻解決

2.邏輯錯誤

4.正常異常處理

錯誤發生之後  會立刻停止代碼的運作
執行except語句 比對錯誤類型
支援多個except      
try:
    name
    l = [1,2,3]
    l[111]
    d = {'name':'jason'}
    d['password']
except NameError:
    print('NameError')
except IndexError:
    print('indexerror')
except KeyError:
    print('keyerror')
finally:
   print('不管出不出錯最後都走這裡,可以用來關閉檔案等資源')      

5.萬能異常處理

try:
    name
    l = [1,2,3]
    l[111]
    d = {'name':'jason'}
    d['password']
except Exception:  # 萬能異常  所有的異常類型都被捕獲 Exception繼承BaseExcept,這裡也可以寫他爸爸
    print('老子天下無敵')
else:
    print('被檢測的代碼沒有任何的異常發生 才會走else')(咱也不知道有啥用)
finally:
    print('無論被檢測的代碼有沒有異常發生 都會在代碼運作完畢之後執行我')(打開檔案後不管處不出錯都關閉檔案)      

6.主動抛出異常

# 主動抛異常
if 'egon' == 'DSB':
    pass
else:
    raise TypeError('盡說大實話')      

7.異常裝飾器

# 異常裝飾器,處理函數的異常
def entry_wrap(func):
    """
    如異常會截圖,并傳回:
        {'error': type, 'msg': error_message, 'error_img': screenshot_path}
    如果正常,則傳回:
        {'content': function_return_value }
    """
    def wrapper(*args, **kwargs):
        try:
            content = func(*args, **kwargs) # 被裝飾任務的傳回值
            result = {'content': content}  # 正常情況下這樣傳回
        except TypeError as e:  # 指名道姓捕捉,try中代碼執行遇到TypeError後走這下面
            result = {'error': 'TypeError', 'msg': e}
        except BaseException as e: # 其他所有異常走這下面
            result = {'error': '其他未知錯誤', 'msg': e}

        if 'error' in result:
            try:
                # 這裡可以做一系列功能,如對錯誤的頁面截圖,傳回結果中增加截圖路徑
                result['error_img'] = 'screenshot_path'
            except:
                pass
        return result
    return wrapper

@entry_wrap  # 函數一旦被裝飾,傳回結果就由裝飾器的傳回值決定,不再是函數自己原汁原味的傳回結果
def test(name):
    try:  # 正常情況走這裡
        name += 1
        return {'name':1,'age':2}
    except:  # 捕捉所有異常
        name += []
        name.split('|')
        return {'error': 'code', 'msg': 'error_message',}

    finally:
        # 出不出錯最後都一定會走這裡,這裡面可以進行檔案資源關閉操作
        pass

no_error = test(1)
print(no_error) # 正常輸出
error_1 = test('a|b')
print(error_1)  # TypeError
error_2 = test([1,2])
print(error_2)  # BaseException -> AttributeError
"""
{'content': {'name': 1, 'age': 2}}
{'error': 'TypeError', 'msg': TypeError('can only concatenate str (not "list") to str'), 'error_img': 'screenshot_path'}
{'error': '其他未知錯誤', 'msg': AttributeError("'list' object has no attribute 'split'"), 'error_img': 'screenshot_path'}
"""      

8.自定義異常

class MyError(BaseException):
     def __init__(self,msg):
         super().__init__()
         self.msg=msg
     def __str__(self):
         return '' %self.msg
#
raise MyError('我自己定義的異常')  # 主動抛出異常其實就是将異常類的對象列印出來,會走__str__方法
#異常資訊:      

9.斷言

l = [1,2,3]
assert len(l) < 0  # 斷言  預言
# 猜某個資料的狀态 猜對了 不影響代碼執行 正常走
# 猜錯了  直接報錯      

繼續閱讀