1. 程式人生 > >python之異常處理,斷言和反射

python之異常處理,斷言和反射

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之異常處理,斷言和反射