(十九)异常处理
什么是異常處理
異常就是程序運行時發(fā)生錯誤的信號(在程序出現(xiàn)錯誤時,則會產(chǎn)生一個異常,若程序沒有處理它,則會拋出該異常,程序的運行也隨之終止),在python中,錯誤觸發(fā)的異常如下
- 語法錯誤: 這種錯誤根本就過不了python解釋器的語法檢測,必須在程序執(zhí)行前就改正
- 邏輯錯誤:
#TypeError:int類型不可迭代
for i in 3:pass
#ValueError
num=input(">>: ") #輸入hello
int(num)#NameError
aaa#IndexError
l=['egon','aa']
l[3]#KeyError
dic={'name':'bruce'}
dic['age']#AttributeError
class Foo:pass
Foo.x#ZeroDivisionError:無法完成計算
res1=1/0
res2=1+'str' 異常的種類
AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x
IOError 輸入/輸出異常;基本上是無法打開文件
ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤
IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]
KeyError 試圖訪問字典里不存在的鍵
KeyboardInterrupt Ctrl+C被按下
NameError 使用一個還未被賦予對象的變量
SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)
TypeError 傳入對象類型與要求的不符合
UnboundLocalError 試圖訪問一個還未被設(shè)置的局部變量,基本上是由于另有一個同名的全局變量,
導(dǎo)致你以為正在訪問它 更多的異常
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 異常處理
為了保證程序的健壯性與容錯性,即在遇到錯誤時程序不會崩潰,我們需要對異常進行處理,
如果錯誤發(fā)生的條件是可預(yù)知的,我們需要用if進行處理:在錯誤發(fā)生之前進行預(yù)防
如果錯誤發(fā)生的條件是不可預(yù)知的,則需要用到try...except:在錯誤發(fā)生之后進行處理
例如
try:f=open('a.log',mode='r',encoding='utf-8')g=(line.strip() for line in f)print(next(g))print(next(g))print(next(g))print(next(g))print(next(g))
except StopIteration:f.close() 異常分類
異常類智能用來出來指定的異常情況,如果非指定異常則無法處理。
s1='hello'
try:int(s1)
except IndexError as ea: #將異常的值 賦予一個變量ea,并將該變量打印出來。print(ea)>>>
ValueError: invalid literal for int() with base 10: 'hello' 多分支,結(jié)構(gòu)和if...else...類似
s1='hello'
try:int(s1)
except IndexError as ea:print(ea)
except StopIteration as e:print(e)
except ValueError as b:print(b)或者s2='world'
try:int(s2)
except (IndexError,ImportError,ValueError) as e:print(e) 什么時候用異常處理
是不是任何程序都加上異常處理就好了呢?當然不是
首先try...except是你附加給你的程序的一種異常處理的邏輯,與你的主要的工作是沒有關(guān)系的,這種東西加的多了,會導(dǎo)致你的代碼可讀性變差
然后異常處理本就不是邏輯的擦屁股紙,只有在錯誤發(fā)生的條件無法預(yù)知的情況下,才應(yīng)該加上try...except
轉(zhuǎn)載于:https://www.cnblogs.com/morron/p/9200616.html
總結(jié)
- 上一篇: 野指针与内存泄漏那些事
- 下一篇: Django模板系统和admin模块