日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr)

發(fā)布時(shí)間:2025/3/15 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、異常處理

python異常:
  python的運(yùn)行時(shí)錯(cuò)誤稱(chēng)作異常
  (1)語(yǔ)法錯(cuò)誤:軟件的結(jié)構(gòu)上有錯(cuò)誤而導(dǎo)致不能被解釋器解釋或不能被編譯器編譯
  (2)邏輯錯(cuò)誤:由于不完整或不合法的輸入所致,也可能是邏輯無(wú)法生成、計(jì)算或者輸出結(jié)果需要的過(guò)程無(wú)法執(zhí)行等

python異常是一個(gè)對(duì)象,表示錯(cuò)誤或意外情況
  (1)在python檢測(cè)到一個(gè)錯(cuò)誤時(shí),將觸發(fā)一個(gè)異常
    python可以通常異常傳導(dǎo)機(jī)制傳遞一個(gè)異常對(duì)象,發(fā)出一個(gè)異常情況出現(xiàn)的信號(hào)
    程序員也可以在代碼中手動(dòng)觸發(fā)異常
  (2)python異常也可以理解為:程序出現(xiàn)了錯(cuò)誤而在正常控制流以外采取的行為
    第一階段:解釋器觸發(fā)異常,此時(shí)當(dāng)前程序流將被打斷
    第二階段:異常處理,如忽略非致命錯(cuò)誤、減輕錯(cuò)誤帶來(lái)的影響等

檢測(cè)和處理異常:
  (1)異常通過(guò)try語(yǔ)句來(lái)檢測(cè)
    任何在try語(yǔ)句塊里的代碼都會(huì)被檢測(cè),以檢查有無(wú)異常發(fā)生
  (2)try語(yǔ)句主要有兩種形式:
    try-except: 檢測(cè)和處理異常
      可以有多個(gè)except
      支持使用else子句處理沒(méi)有探測(cè)異常的執(zhí)行的代碼
    try-finally: 僅檢查異常并做一些必要的清理工作
      僅能有一個(gè)finally
  (3)try語(yǔ)句的復(fù)合形式:
    try-execpt-else-finally

?

1、異常基礎(chǔ)

在編程過(guò)程中為了增加友好性,在程序出現(xiàn)bug時(shí)一般不會(huì)將錯(cuò)誤信息顯示給用戶,而是現(xiàn)實(shí)一個(gè)提示的頁(yè)面,通俗來(lái)說(shuō)就是不讓用戶看見(jiàn)大黃頁(yè)!!!

try:pass except Exception as ex: pass

#python3.x中是這么寫(xiě)的,python2.x是這么寫(xiě)的: ?except Exception,e:

需求:將用戶輸入的兩個(gè)數(shù)字相加  

while True:num1 = raw_input('num1:')num2 = raw_input('num2:')try:num1 = int(num1)num2 = int(num2)result = num1 + num2except Exception as e:print('出現(xiàn)異常,信息如下:')print(e)

2、異常種類(lèi)

python中的異常種類(lèi)非常多,每個(gè)異常專(zhuān)門(mén)用于處理某一項(xiàng)異常!!!

AssertionError: 斷言語(yǔ)句失敗 AttributeError: 屬性引用或賦值失敗 FloatingPointError: 浮點(diǎn)型運(yùn)算失敗 IOError: I/O操作失敗 ImportError: import語(yǔ)句不能找到要導(dǎo)入的模塊,或者不能找到該模塊特別請(qǐng)求的名稱(chēng) IndentationError: 解析器遇到了一個(gè)由于錯(cuò)誤的縮進(jìn)而引發(fā)的語(yǔ)法錯(cuò)誤 IndexError: 用來(lái)索引序列的證書(shū)超出了范圍 KeyError: 用來(lái)索引映射的鍵不再映射中 keyboardInterrupt: 用戶按了中斷鍵(Ctrl+c,Ctrl+Break或Delete鍵) MemoryError: 運(yùn)算耗盡內(nèi)存 NameError: 引用了一個(gè)不存在的變量名 NotImplementedError: 由抽象基類(lèi)引發(fā)的異常,用于指示一個(gè)具體的子類(lèi)必須覆蓋一個(gè)方法 OSError: 由模塊os中的函數(shù)引發(fā)的異常,用來(lái)指示平臺(tái)相關(guān)的錯(cuò)誤 OverflowError: 整數(shù)運(yùn)算的結(jié)果太大導(dǎo)致溢出 SyntaxError: 語(yǔ)法錯(cuò)誤 SystemError: python本身或某些擴(kuò)展模塊中的內(nèi)部錯(cuò)誤 TypeError:對(duì)某對(duì)象執(zhí)行了不支持的操作 UnboundLocalError:引用未綁定值的本地變量 UnicodeError:在Unicode的字符串之間進(jìn)行轉(zhuǎn)換時(shí)發(fā)生的錯(cuò)誤 ValueError:應(yīng)用于某個(gè)對(duì)象的操作或函數(shù),這個(gè)對(duì)象具有正確的類(lèi)型,但確有不適當(dāng)?shù)闹?WindowsError:模塊os中的函數(shù)引發(fā)的異常,用來(lái)指示與WIndows相關(guān)的錯(cuò)誤 ZeroDivisionError: 除數(shù)為0 ArithmeticError AssertionError AttributeError BaseException BufferError BytesWarning DeprecationWarning EnvironmentError EOFError Exception FloatingPointError FutureWarning GeneratorExit ImportError ImportWarning IndentationError IndexError IOError KeyboardInterrupt KeyError LookupError MemoryError NameError NotImplementedError OSError OverflowError PendingDeprecationWarning ReferenceError RuntimeError RuntimeWarning StandardError StopIteration SyntaxError SyntaxWarning SystemError SystemExit TabError TypeError UnboundLocalError UnicodeDecodeError UnicodeEncodeError UnicodeError UnicodeTranslateError UnicodeWarning UserWarning ValueError Warning ZeroDivisionError 更多異常

實(shí)例:IndexError

dic = ["python", 'linux'] try:dic[10] except IndexError as e:print(e)

實(shí)例:KeyError

dic = {'k1':'v1'} try:dic['k20'] except KeyError as e:print(e)

對(duì)于上述實(shí)例,異常類(lèi)只能用來(lái)處理指定的異常情況,如果非指定異常則無(wú)法處理。

# 未捕獲到異常,程序直接報(bào)錯(cuò)s1 = 'hello' try:int(s1) except IndexError as e:print(e)

所以,寫(xiě)程序時(shí)需要考慮到try代碼塊中可能出現(xiàn)的任意異常,可以這樣寫(xiě):  

s1 = 'hello' try:int(s1) except IndexError as e:print(e) except KeyError as e:print(e) except ValueError as e:print(e)

萬(wàn)能異常 在python的異常中,有一個(gè)萬(wàn)能異常:Exception,他可以捕獲任意異常,即:  

s1 = 'hello' try:int(s1) except Exception as e:print(e)

接下來(lái)你可能要問(wèn)了,既然有這個(gè)萬(wàn)能異常,其他異常是不是就可以忽略了!

答:當(dāng)然不是,對(duì)于特殊處理或提醒的異常需要先定義,最后定義Exception來(lái)確保程序正常運(yùn)行

s1 = 'hello' try:int(s1) except KeyError as e:print('鍵錯(cuò)誤') except IndexError as e:print('索引錯(cuò)誤') except Exception as e:print('錯(cuò)誤')

3、異常其他結(jié)構(gòu)  

try:# 主代碼塊pass except KeyError as e:# 異常時(shí),執(zhí)行該塊pass else:# 主代碼塊執(zhí)行完,執(zhí)行該塊pass finally:# 無(wú)論異常與否,最終執(zhí)行該塊pass

4、主動(dòng)觸發(fā)異常  

try:raise Exception('錯(cuò)誤了。。。') except Exception as e:print(e)

5、自定義異常  

class MyException(Exception):def __init__(self, msg):self.message = msgdef __str__(self):return self.messagetry:raise MyException('我的異常') except WupeiqiException as e:print(e)

6、斷言  

# assert 條件assert 1 == 1assert 1 == 2

二、反射

  python中的反射功能是由以下四個(gè)內(nèi)置函數(shù)提供:hasattr、getattr、setattr、delattr、__import__(module_name)、importlib,改五個(gè)函數(shù)分別用于對(duì)對(duì)象內(nèi)部執(zhí)行:檢查是否含有某成員、獲取成員、設(shè)置成員、刪除成員、導(dǎo)入模塊以字符串方式導(dǎo)入。

class Foo(object):def __init__(self):self.name = 'python'def func(self):return 'func'obj = Foo()# #### 檢查是否含有成員 #### hasattr(obj, 'name') hasattr(obj, 'func')# #### 獲取成員 #### getattr(obj, 'name') getattr(obj, 'func')# #### 設(shè)置成員 #### setattr(obj, 'age', 18) setattr(obj, 'show', lambda num: num + 1)# #### 刪除成員 #### delattr(obj, 'name') delattr(obj, 'func')

詳細(xì)解析:

當(dāng)我們要訪問(wèn)一個(gè)對(duì)象的成員時(shí),應(yīng)該是這樣操作:

class Foo(object):def __init__(self):self.name = 'python'def func(self):return 'func'obj = Foo()# 訪問(wèn)字段 obj.name # 執(zhí)行方法 obj.func() 那么問(wèn)題來(lái)了? a、上述訪問(wèn)對(duì)象成員的 name 和 func 是什么?? 答:是變量名 b、obj.xxx 是什么意思?? 答:obj.xxx 表示去obj中或類(lèi)中尋找變量名 xxx,并獲取對(duì)應(yīng)內(nèi)存地址中的內(nèi)容。 c、需求:請(qǐng)使用其他方式獲取obj對(duì)象中的name變量指向內(nèi)存中的值 “python” class Foo(object):def __init__(self):self.name = 'python'# 不允許使用 obj.name obj = Foo()

答:有兩種方式,如下:

class Foo(object):def __init__(self):self.name = 'python'def func(self):return 'func'# 不允許使用 obj.name obj = Foo()print obj.__dict__['name']

第二種:

class Foo(object):def __init__(self):self.name = 'python'def func(self):return 'func'# 不允許使用 obj.name obj = Foo()print getattr(obj, 'name')

d、比較三種訪問(wèn)方式

  • obj.name
  • obj.__dict__['name']
  • getattr(obj, 'name')

答:第一種和其他種比,...
? ? ? 第二種和第三種比,...

#!/usr/bin/env python #coding:utf-8 from wsgiref.simple_server import make_serverclass Handler(object):def index(self):return 'index'def news(self):return 'news'def RunServer(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])url = environ['PATH_INFO']temp = url.split('/')[1]obj = Handler()is_exist = hasattr(obj, temp)if is_exist:func = getattr(obj, temp)ret = func()return retelse:return '404 not found'if __name__ == '__main__':httpd = make_server('', 8001, RunServer)print "Serving HTTP on port 8000..."httpd.serve_forever()

結(jié)論:反射是通過(guò)字符串的形式操作對(duì)象相關(guān)的成員。一切事物都是對(duì)象!!!

  

類(lèi)也是對(duì)象

class Foo(object):staticField = "old boy"def __init__(self):self.name = 'wupeiqi'def func(self):return 'func'@staticmethoddef bar():return 'bar'print getattr(Foo, 'staticField') print getattr(Foo, 'func') print getattr(Foo, 'bar')

模塊也是對(duì)象

home.py

#!/usr/bin/env python # -*- coding:utf-8 -*-def dev():return 'dev'

?index.py

#!/usr/bin/env python # -*- coding:utf-8 -*-""" 程序目錄:home.pyindex.py當(dāng)前文件:index.py """import home as obj#obj.dev() func = getattr(obj, 'dev') func()

兩個(gè)例子:

第一個(gè)例子:模塊和主程序在同一目錄

home.py

#!/usr/bin/env python # -*- coding:utf-8 -*-def index():print("炫酷的主頁(yè)面")

index.py

#!/usr/bin/env python # -*- coding:utf-8 -*- # 反射:基于字符串的形式去對(duì)象(模塊)中操作其成員getattr(),setattr(),hasattr(),delattr() # 擴(kuò)展:導(dǎo)入模塊 # import xxx # from xxx import ooo # # obj = __import__("xxx") # obj = __import__("xxx." + ooo,fromlist=True)def run():while True:inp = input("請(qǐng)輸入要訪問(wèn)的URL:")mo,fn = inp.split('/')obj = __import__(mo)if hasattr(obj,fn):func = getattr(obj,fn)func()else:print("網(wǎng)頁(yè)不存在")run()

執(zhí)行的時(shí)候輸入U(xiǎn)RL:home/index ? 這樣就執(zhí)行了home模塊下的index函數(shù)

第二個(gè)例子:模塊和主程序不在同一目錄

lib/account.py  

#!/usr/bin/env python # -*- coding:utf-8 -*-def login():print("炫酷的登錄頁(yè)面")def logout():print("炫酷的退出頁(yè)面")

index1.py

#!/usr/bin/env python # -*- coding:utf-8 -*-# 反射:基于字符串的形式去對(duì)象(模塊)中操作其成員getattr(),setattr(),hasattr(),delattr() # 擴(kuò)展:導(dǎo)入模塊 # import xxx # from xxx import ooo # # obj = __import__("xxx") # obj = __import__("xxx." + ooo,fromlist=True)def run():while True:inp = input("請(qǐng)輸入要訪問(wèn)的URL:")mo,fn = inp.split('/')obj = __import__("lib." + mo,fromlist=True)if hasattr(obj,fn):func = getattr(obj,fn)func()else:print("網(wǎng)頁(yè)不存在")run()

執(zhí)行的時(shí)候輸入U(xiǎn)RL:account/login 這樣就執(zhí)行了lib/account下的login函數(shù)

?

###?另外一種實(shí)現(xiàn)方式

index2.py

import importlibmodule = "lib.account" func_name = "login"m = importlib.import_module(module) func = getattr(m, func_name) func()

  

  

利用反射和super()的一個(gè)例子:點(diǎn)這里

轉(zhuǎn)載于:https://www.cnblogs.com/xiaozhiqi/p/5778856.html

總結(jié)

以上是生活随笔為你收集整理的Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 手机在线看a | 亚洲AV无码精品自拍 | 日韩和欧美一区二区 | 青青青在线视频 | 青青青手机在线视频 | 欧美成人午夜影院 | 日本aa在线观看 | 精精国产xxxx视频在线 | 日韩三级在线免费观看 | 久久国产精品国语对白 | 亚洲一区二区三区在线视频观看 | 美女扒开屁股让男人桶 | 久久社区视频 | 日韩aⅴ片 | 99热这里都是精品 | 无套内谢的新婚少妇国语播放 | 国产激情片 | 日韩av不卡在线播放 | 一本一道无码中文字幕精品热 | 日韩一级生活片 | 五月天丁香在线 | 国产成人无码久久久精品天美传媒 | 色老头在线一区二区三区 | 欧美少妇bbw | 91av视频在线免费观看 | 久久99精品久久久久 | 亚洲一本二本 | 美痴女~美人上司北岛玲 | japanesexxxx日本妞| 色久影院 | 欧美一区二区在线免费观看 | 日韩一区二区三区四区五区 | 亚洲一区中文字幕永久在线 | 亚洲av无码久久精品狠狠爱浪潮 | 91黑人精品一区二区三区 | 91av一区 | 中文字幕一区二区三区乱码人妻 | 国产在线观看一区二区三区 | 欧美二区在线观看 | 亚洲乱强伦 | 亚洲成人免费在线观看 | 天天操中文字幕 | 久久精品国产一区二区三区 | 亚洲综合社区 | 亚洲精品欧美精品 | 精品三级 | 都市激情校园春色亚洲 | 亚洲成人婷婷 | 日批av | 国产亚洲精品久久久久久无几年桃 | av毛片在线播放 | 日本色站| 国产欧美视频在线 | 亚洲欧美日本一区二区三区 | 中文字幕一区二区三区久久久 | 亚洲国产爱 | 日本人和亚洲人zjzjhd | 高h教授1v1h喂奶 | 亚洲一区图片 | 999av视频 | 国产调教一区 | 丹丹的呻吟声1一7 | 午夜久久久久久 | 深夜免费福利视频 | 欧美色图一区二区 | 99re7| 日本www黄 | 天天躁狠狠躁 | 日韩一级黄色大片 | 国产色呦呦 | 中国老太婆性视频 | 国产日韩欧美在线观看视频 | 亚洲国产一区在线 | 亚洲成人黄色影院 | 久久久久久久国产精品美女 | 91精品人妻一区二区三区蜜桃欧美 | 国产丰满果冻videossex | 亚洲av永久一区二区三区蜜桃 | 开心六月婷婷 | av日韩在线播放 | 亚洲区小说 | 饥渴丰满的少妇喷潮 | 亚洲国产日韩欧美一区二区三区 | 五月天色视频 | av一区二区免费 | 一区成人| 自拍亚洲一区 | 亚洲一区二区福利视频 | 久久精品国产亚洲av久 | 国产奶头好大揉着好爽视频 | 午夜视频网站在线观看 | 久久亚洲AV成人无码一二三 | 一区二区片 | 一本大道东京热无码aⅴ | 久久久88| 91蝌蚪91密月| 偷拍亚洲精品 | 在线观看视频毛片 | 麻豆视频在线观看免费网站黄 |