python自定義異常類方式
python自定義異常類
why?
在開(kāi)發(fā)中一般是禁止寫(xiě)if···else···的,雖然if···else···很好理解,但那樣顯得代碼不專業(yè),而且有時(shí)候會(huì)有點(diǎn)冗余!
what?
在python中一般都有一個(gè)異常類,這里面有一些自帶的異常,比如:TypeError、ValueError 等,但這些遠(yuǎn)遠(yuǎn)不能滿足我們的需求,我們時(shí)常會(huì)定義自己的異常包,然后導(dǎo)入這個(gè)包,這樣就可以愉快的開(kāi)發(fā)了,下面就來(lái)展示一下如何定義自己的異常類。
how?
我們想讓函數(shù)返回值不是我們想要的時(shí)候就拋出異常,我們完全可以用C語(yǔ)言的if···else··語(yǔ)句,但是為了演示我們是用python的try···except···,raise表示拋出異常,就是在返回值不等于True的時(shí)候就拋出異常
#一般都會(huì)讓異常繼承這個(gè)類,(或者是更高級(jí)的BaseException) #默認(rèn)大家知道__init__和__str__ class NotEqual(Exception): ? ? def __init__(self, msg): ? ? ? ? self.msg = msg ? ? def __str__(self): ? ? ? ? return self.msg class OPT(): ? ? def test_suit(self, a): ? ? ? ? if a > 10: ? ? ? ? ? ? return True ? ? ? ? else: ? ? ? ? ? ? return False ? ? def test(self): ? ? ? ? try: ? ? ? ? ? ? if ( (True != self.test_suit(5)) or ? ? ? ? ? ? ? ? ?(True != self.test_suit(15)) ): ? ? ? ? ? ? #raise表示拋出異常,后面必須是定義過(guò)的異常類, ? ? ? ? ? ? #括號(hào)中的內(nèi)容是大家想讓程序打印的內(nèi)容 ? ? ? ? ? ? ?? ?raise NotEqual("not equal")?? ? ? ? ? ? except NotEqual as e: ? ? ? ? ? ? print("{}".format(e)) if __name__ == '__main__': ? ? option = OPT() ? ? option.test() #運(yùn)行結(jié)果 >>>$ python test.py >>> ?not equal
程序結(jié)尾處的print表示打印到終端(屏幕)的內(nèi)容,在開(kāi)發(fā)中我們還應(yīng)當(dāng)加上python的日志系統(tǒng)(self.logger.debug("……")),讓輸出的內(nèi)容打印到日志中,方便我們定位問(wèn)題。
注意:
本來(lái)True == False不是異常,只是一個(gè)非真值,但在這里我們將其處理成了異常,因?yàn)閜ython肯定沒(méi)有這樣的異常,所以我們必須在開(kāi)始要定義一個(gè)異常類,這樣就可以用了。
python自定義異常捕獲
我們?cè)谔幚沓绦虍惓5臅r(shí)候,可能需要自己定義一些傳入的message,自己定義一些error對(duì)應(yīng)的error_code,在后續(xù)做異常統(tǒng)計(jì)的時(shí)候可以有自定義的數(shù)據(jù),這時(shí)候其實(shí)我們可以自定義異常捕獲類。
異常類一般都是繼承自Exception,自定義異常類如下:
class CustomException(Exception): ? ? """ ? ? Customized Exception ? ? Exception raised for errors in the input salary. ? ? Attributes: ? ? ? ? msg ?-- error message ? ? ? ? code -- error attribution ? ? """ ? ? msg, code = "", 0 ? ? def __init__(self, **kwargs): ? ? ? ? for k, v in kwargs.items(): ? ? ? ? ? ? setattr(self, k, v) class UnknownException(CustomException): ? ? code = 100 class ItemClickFailedException(CustomException): ? ? """ ? ? clickable item clicking failed ? ? """ ? ? msg = "failed to click item" ? ? code = 1 class ItemNotFoundException(CustomException): ? ? """ ? ? clickable item not found ? ? """ ? ? msg = "clickable item not found" ? ? code = 2
定義了異常類之后,可以在程序可能出現(xiàn)這些異常的時(shí)候,raise這些異常
?def random_click(self, item, items) -> Info: ? ? ? if len(items) == 0: ? ? ? ? ? raise ItemClickFailedException() ? ? ? if not self.is_clickable(item): ? ? ? ? ? raise ItemClickFailedException(msg="item is not visible") ? ? ? item_attr, item_rect = self.click_item(item) ? ? ? return Info(result=True, area=item_attr, x=item_rect.center[0], y=item_rect.center[1], error=[])
并在相應(yīng)的時(shí)候去進(jìn)行捕獲
def click(self, item, items) -> ClickInfo: ?? ?error_list = [] ?? ?try: ?? ??? ?result: ClickInfo = self.random_click(item, items) ?? ?except Exception as e: ?? ??? ?# 此時(shí)捕獲到的是具體的異常類實(shí)例 ?? ??? ?error_list.append(e) ?? ?for error in error_list: ?? ??? ?print("msg={}, code={}".format(error.msg, error.code))
如果之前raise的異常是ItemNotFoundException,那將打印出
msg=item is not visible, code=2
如果raise的異常是ItemClickFailedException,那將打印出
msg=failed to click item, code=1
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python編程使用PyQt制作預(yù)覽窗口游戲中的小地圖
這篇文章主要為大家介紹了python使用PyQt制作預(yù)覽窗口游戲中的小地圖實(shí)現(xiàn)示例過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10解決jupyter運(yùn)行pyqt代碼內(nèi)核重啟的問(wèn)題
這篇文章主要介紹了解決jupyter運(yùn)行pyqt代碼內(nèi)核重啟的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python?Asyncio庫(kù)之a(chǎn)syncio.task常用函數(shù)詳解
Asyncio在經(jīng)過(guò)一段時(shí)間的發(fā)展以及獲取Curio等第三方庫(kù)的經(jīng)驗(yàn)來(lái)提供更多的功能,目前高級(jí)功能也基本完善。本文主要介紹了Asyncio庫(kù)中asyncio.task常用函數(shù)的使用,需要的可以參考一下2023-03-03pycharm+django創(chuàng)建一個(gè)搜索網(wǎng)頁(yè)實(shí)例代碼
這篇文章主要介紹了pycharm+django創(chuàng)建一個(gè)搜索網(wǎng)頁(yè)實(shí)例代碼,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Selenium自動(dòng)化測(cè)試工具使用方法匯總
這篇文章主要介紹了Selenium自動(dòng)化測(cè)試工具使用方法匯總,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06python使用pyecharts繪制簡(jiǎn)單的折線圖
這篇文章講給大家介紹一下python使用pyecharts繪制簡(jiǎn)單的折線圖的黨法步驟,文中有詳細(xì)的代碼示例講解,對(duì)我們學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-07-07Python自定義類的數(shù)組排序?qū)崿F(xiàn)代碼
這篇文章主要介紹了Python自定義類的數(shù)組排序?qū)崿F(xiàn)代碼,需要的朋友可以參考下2016-08-08numpy使用fromstring創(chuàng)建矩陣的實(shí)例
今天小編就為大家分享一篇numpy使用fromstring創(chuàng)建矩陣的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Python實(shí)現(xiàn)簡(jiǎn)單的代理服務(wù)器
這篇文章主要介紹了Python實(shí)現(xiàn)簡(jiǎn)單的代理服務(wù)器,可實(shí)現(xiàn)代理服務(wù)器基本的包轉(zhuǎn)發(fā)功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07