python之異常處理,斷言和反射
阿新 • • 發佈:2018-11-10
pyc python 存在 ase module 定義 sat gif 機制
回到頂部
1、異常基礎
python在運行過程中,程序解釋機制會測試代碼,如檢測不通過則會拋出異常。
try: aa = 10 bb = ‘10‘ cc = aa + bb except Exception as e: print(‘error:‘,e) #output輸出異常,數字不能與字符向加 error: unsupported operand type(s) for +: ‘int‘ and ‘str‘
try:
aa = 10
bb = ‘10‘
cc = aa + bb
except TypeError as e:
print(‘錯誤信息;‘,e)
2、異常種類
python中的異常種類非常多,每個異常專門處理某個項的異常!
AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x IOError 輸入/輸出異常;基本上是無法打開文件 ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤 IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊 IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5] KeyError 試圖訪問字典裏不存在的鍵 KeyboardInterrupt Ctrl+C被按下 NameError 使用一個還未被賦予對象的變量 SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了) TypeError 傳入對象類型與要求的不符合 UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是由於另有一個同名的全局變量,導致你以為正在訪問它 ValueError 傳入一個調用者不期望的值,即使值的類型是正確的
s1 = ‘hello‘ try: int(s1) except KeyError as e:回到頂部print(‘鍵錯誤‘) except IndexError as e: print(‘索引錯誤‘) except TypeError as e: print(‘類型錯誤‘) except ValueError as e: print(‘值的類型錯誤‘) except Exception as e: print(‘錯誤‘)
3、異常的結構
try:# 主代碼塊
pass
except KeyError as e:# 異常時,執行該塊
pass
else:# 主代碼塊執行完,執行該塊
pass
finally: # 無論異常與否,最終執行該塊
pass
回到頂部4、自定義異常
class MyException(Exception): def __init__(self, msg): self.message = msg def __str__(self): return self.message try: raise MyException(‘我的異常‘) #raise為主動觸發異常 except MyException as e: print(‘>>>:‘,e)回到頂部
5、斷言
assert斷言是聲明其布爾值必須為真的判定,如果發生異常就說明表達示為假。可以理解assert斷言語句為raise-if-not,用來測試表示式,其返回值為假,就會觸發異常。
assert 1 == 1 print(‘---------------‘) assert 1 == 2 #output,如果為真時不輸出信息,如果為假時Flase則直接拋出異常 --------------- Traceback (most recent call last): File "Z:/python_project/day18/ddd/yichang.py", line 26, in <module> assert 1 == 2 AssertionError回到頂部
6、反射
python中的反射功能是由以下四個內置函數提供:hasattr、getattr、setattr、delattr,改四個函數分別用於對對象內部執行:檢查是否含有某成員、獲取成員、設置成員、刪除成員。
class A(object): def __init__(self): self.name = ‘python‘ self.age = 18 def func(self): return self.age obj1 = A() #檢查對象是否含有成員 print(hasattr(obj1,‘age‘)) #True print(hasattr(obj1,‘func‘)) #True #獲取對象成員 print(getattr(obj1,‘name‘)) #python print(getattr(obj1,‘func‘)) #<bound method A.func of <__main__.A object at 0x000000C0C7B9D048>> #設置對象成員 setattr(obj1,‘slary‘,9999) print(getattr(obj1,‘slary‘)) #9999 #刪除成員 delattr(obj1,‘slary‘) print(hasattr(obj1,‘slary‘)) #False
結論:反射是通過字符串的形式操作對象相關的成員
class A(object): def __init__(self): self.name = ‘python‘ self.age = 18 def func(self): print(‘func:‘,self.name) return self.age obj1 = A() #通過獲取對象的方法來執行對象方法 obj = A() fun = getattr(obj,‘func‘) fun()
python之異常處理,斷言和反射