python中錯誤處理分為兩類:語法錯誤和異常處理。
語法錯誤:
語法錯誤一般是指由於python語句、表示式、函式等存在書寫格式活語法規則上的錯誤丟擲的異常,如python常見的縮排控制,若同層次的執行語句存在縮排不同,會報語法錯誤(syntaxerror),一般在ide中會有明顯的提示,其屬於編譯階段的錯誤,一般是導致解析錯誤丟擲錯誤;
>>>while
true
print
'hello world'
syntaxerror: invalid syntax
異常處理:
異常處理一般是指python語法格式正確,但在執行過程出現錯誤,錯誤型別交由python中的內建異常進行說明,回朔處理,這種型別的處理一般都是出現在執行階段,是需要處理的。
in [1]: 1/0
zerodivisionerror: integer division or modulo by zero
in [2]: vin *3
nameerror: name 'vin' is
not defined
in [3]: '1'+1
typeerror: cannot concatenate 'str' and
'int' objects
1.捕捉異常
可以使用try/except語句。
try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常資訊並處理。
當使用者輸入異常時,except可以保證程式可以正常執行。
in [4]: while true:
...: try:
...: x = int (raw_input("please input a number: "))
...: break
...: except valueerror:
...: print "try again please.. the number is unvalid"
...:
please input a number: as
try again please.. the number is unvalid
please input a number: 12
乙個try宣告可以對應多個except子句,乙個except字句可以用元組的形式包含多個異常型別。
... except (runtimeerror, typeerror, nameerror):
... pass
捕獲未知錯誤:
在開發的時候,要判斷所有可能出現的錯誤,是有一定難度的
如果希望程式無論出現任何錯誤,都不會因python直譯器丟擲異常而終止,可以再增加乙個except
... expect:
... pass
try :
n = int(raw_input("input a number:"))
result = 21 / n
print result
except exception
as result: ##捕獲未知異常;result:任意乙個變數名
print
"error %s" % result
else: ##無異常時才會執行的**
print
"success!"
finally: ##無論**是否異常,均會輸出。
print
'nnmm' *34
input a
number:sa
error invalid literal for int() with base 10: 'sa'
input a
number:0
error integer division or modulo by
zero
2.丟擲異常
異常丟擲可以讓我們定義主動丟擲異常的邏輯,以提醒使用者需要進行某些必要的異常判斷或者處理,python中的異常丟擲使用關鍵字raise實現。
try:
f = open('a.txt')
s = f.readline()
i = int(s.strip())
except ioerror as e:
print
"i/o error(): ".format(e.errno, e.strerror)
except valueerror:
print
"could not convert data to an integer."
except:
print
"unexpected error:", sys.exc_info()[0]
raise
##丟擲處理錯誤資訊檔案
##還可以將異常例項化,並且自定義新增一些屬性
try:
raise exception('spam', 'eggs')
except exception
as inst:
print type(inst) # the exception instance
print inst.args # arguments stored in .args
print inst # __str__ allows args to be printed directly
x, y = inst.args
print
'x =', x
print
'y =', y
'exceptions.exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
3.異常傳遞性
異常的傳遞–當函式/方法執行出現異常,會將異常傳遞給函式/方法呼叫的一方。如果傳遞到主程式,依舊沒有異常處理,程式才會終止,可以在主程式中增加異常捕獲,而在主函式中呼叫其他函式,只要出現異常,都會傳遞到主函式的異常捕獲中,這就不需要在**中,增加大量的異常捕獲,能夠保證**的整潔。
def
demo
():return int(raw_input("input number:"))
defdemo2
():return demo()
try:
print demo()
except exception as result:
print
"error: %s " % result
>>>input number:12a
error: invalid literal for int() with base 10: '12a'
4.自定義異常def
paswswd
():##密碼輸入位數不小於8,否則輸出異常
pwd = raw_input("passwd:")
if len(pwd) >=8:
return pwd
ex = exception('passwd is too short!!') ### 建立異常物件(可以新增錯誤資訊)
raise ex
# 注意:只丟擲異常而不捕獲異常,**會錯出
try:
print paswswd()
except exception as result:
print result
# 先建立異常物件,再丟擲異常,再在主函式中捕獲異常
>>>passwd:111
passwd is too short!!
斷言
可以理解為提前預言,讓人更好的知道錯誤原因
def
func
(num,div):
assert (div != 0),'div不能為0'
##在執行程式內部,用assert對可能發生的錯誤進行預判。
return num / div
print func(10,0)
>>>assertionerror: div不能為0
python異常處理 Python 異常處理
使用者輸入不完整 比如輸入為空 或者輸入非法 輸入不是數字 異常就是程式執行時發生錯誤的訊號,在python中,錯誤觸發的異常如下 在python中不同的異常可以用不同的型別 python中統一了類與型別,型別即類 去標識,不同的類物件標識不同的異常,乙個異常標識一種錯 觸發indexerror 觸...
python異常舉例 Python異常處理
1.1異常問題舉例 例一 i input 請輸入數字 請輸入數字 0 print i print 5 int i traceback most recent call last file line 1,in zerodivisionerror division by zero 上述 的報錯是除零的錯...
python異常處理
當你的程式中出現異常情況時就需要異常處理。比如當你開啟乙個不存在的檔案時。當你的程式中有一些無效的語句時,python會提示你有錯誤存在。下面是乙個拼寫錯誤的例子,print寫成了print。python是大小寫敏感的,因此python將引發乙個錯誤 print hello world file l...