Python的異常處理

tmpdir__17_9_7_15_04_07.jpg

一、系統(tǒng)常見的異常

你必須先知道有那些異常,到時候遇到的時候才不會驚慌。
1.除0異常 ZeroDivisionError

出現(xiàn)情況: 1 / 0
結(jié)果: ZeroDivisionError: division by zero

2.名稱異常 NameError

出現(xiàn)情況: print(name)
結(jié)果:NameError: name 'name' is not defined

3.類型異常 TypeError

出現(xiàn)情況: print('1' + 2)
結(jié)果:TypeError: can only concatenate str (not "int") to str

4.索引異常 IndexError

出現(xiàn)情況:
l = [1, 2]
l[3]
結(jié)果:IndexError: list index out of range

5.鍵異常 KeyError

出現(xiàn)情況:
dict = {"name": "子木"}
dict["lz"]
結(jié)果:KeyError: 'lz'

6.值異常異常 ValueError

出現(xiàn)情況:
int('abc')
結(jié)果:ValueError: invalid literal for int() with base 10: 'abc'

7.屬性異常 AttributeError

出現(xiàn)情況:
class Person(object):
pass
p = Person()
print(p.name)
結(jié)果:AttributeError: 'Person' object has no attribute 'name'

8.迭代器異常 StopIteration

出現(xiàn)情況:
it = iter([1, 2])
print(next(it))
print(next(it))
print(next(it))
結(jié)果:StopIteration

總結(jié) :系統(tǒng)異常繼承樹結(jié)構(gòu) 特定異常 --> Exception -- > BaseException -- > object

二、異常處理

方案一:

try:
    print("可能出現(xiàn)異常的代碼")
    print(name)
except (NameError, ZeroDivisionError) as error_domin:
    print('捕捉異常類型-NameError',error_domin)
except ValueError as renson:
    print("捕捉異常類型-ValueError",renson)
except Exception as renson:
    print("捕捉異常類型-Exception", renson)    
else:
    print("沒有異常執(zhí)行代碼")
finally:
    print("不管有沒有異常都要執(zhí)行的代碼")

方案二:

  # with 預(yù)處理A  處理完成之后執(zhí)行清理操作
  # with context[as  **arg]: 1、 __enter__ 方法進(jìn)入  2、執(zhí)行與具體body  3、__exit__方法退出
  #    with.body
import traceback
class custom_context(object):
    def __enter__(self):
        print("enter")
        return self

# 退出時候參數(shù)都是異常信息 和 追蹤信息 如果返回true 異常不會傳出去  返回false 異常會傳出去
# 這里可以把異常寫入日志
def __exit__(self, exc_type, exc_val, exc_tb):
    print(self, exc_type, exc_val, exc_tb)
    print("exit")
    print(traceback.extract_tb(exc_tb))
    return True

 # context 是 __enter__ 返回的對象
with custom_context() as context:
    print("主體代碼", context)

2.手動拋出異常

 def set_age(age):
    if age <= 0 or age > 100:
        raise ValueError("設(shè)置年齡不對")  # 手動拋出異常
   else:
        print("設(shè)置張三的年齡是", age)

set_age(18)
set_age(-18)

3.自定義異常

 class CustomException(Exception):
    def __init__(self, message, error_code):
        self.message = message
        self.errorCode = error_code
    def __str__(self):
        return "自定義異常類的信息:{} 錯誤碼:{}".format(self.message, self.errorCode)

def set_age(age):
    if age <= 0 or age > 100:
        raise CustomException("設(shè)置年齡不對", 404)
    else:
        print("設(shè)置張三的年齡是", age)

try:
    set_age(-18)
except Exception as e:
    print(e)

最后贈言

學(xué)無止境,學(xué)習(xí)Python的伙伴可以多多交流。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在python程序執(zhí)行過程中(在其他編程語言中也是一樣),難免會由于各種意想不到的情況導(dǎo)致程序運(yùn)行異常而報錯。而這...
    仰望星空的小狗閱讀 377評論 0 0
  • python中常見的異常 NameError:嘗試訪問一個未申明的變量 ZeroDivisionError:除數(shù)為...
    junson閱讀 510評論 0 1
  • python的異常處理 一、 基本格式 # 示例一:importrequeststry:# 嘗試進(jìn)行下面操作,如果...
    空氣_2c99閱讀 255評論 0 0
  • 在執(zhí)行程序的過程中,可能會遇到多多少少的“意外情況”,比如除數(shù)為 0,文件找不到,變量未聲明等。解釋器在發(fā)現(xiàn)這些異...
    柏丘君閱讀 1,082評論 0 1
  • 睡到半夜醒來,渾身難受??照{(diào)吹風(fēng)也覺得冷。 上午十點(diǎn)醒來,跑了幾趟廁所后,終于意識到著涼感冒了。 這倒春寒,真有勁兒~
    跑馬的漢子閱讀 185評論 0 0

友情鏈接更多精彩內(nèi)容