python至少有2類不同的錯誤:語法錯誤(syntax errors)和異常(exceptions)。
8.1 語法錯誤
這個單詞應該還是很有必要認識的,呵呵,語法錯誤,也叫解析錯誤,是我們最不願意發生的錯誤,直接拿官網的例子:
>>> while true print 'hello world
'file
"", line 1, in ?
while true print '
hello world
' ^syntaxerror: invalid syntax
語法錯誤提示時會先列印出現語法的語句然後在這語句中打上『 ^ 』 表示離語法錯誤最近的地方。例子中就是在print前少了引號(這是乙個死迴圈~~):
>>> while true: print 'hello world
'...
hello world
8.2 異常
乙個語句或者乙個表示式即使編譯時是沒有語法錯誤的,但是也有可能在執行時出現問題,這種問題也叫異常(非致命性),異常通常都是有在程式中進行處理的。異常是有不同型別的,常見的異常型別有zerodivisionerror,
nameerror and typeerror,這類異常稱為標準異常,是在build-in裡面定義的,可以檢視built-in exceptions。還有一類異常是使用者自定義的。
>>> 10 * (1/0)traceback (most recent call last):
file
"", line 1, in ?zerodivisionerror: integer division or modulo by zero>>> '
2' + 2
traceback (most recent call last):
file
"", line 1, in ?typeerror: cannot concatenate
'str
' and '
int' objects
8.3 處理異常
直接給乙個比較全的異常處理的例子:開啟乙個txt文件,讀入第一行的資料,轉換成int資料型別,如果都成功,就列印txt總共有多少行,最後關閉文件。
try: f = open ('
test.txt
','r+')
s =f.readline()
i = int
(s.strip())
except ioerror
ase:
'i/o error():
'.format(e.errno,e.strerror)
except valueerror:
"could not convert data to integer
"except:
"unexpected error:
",sys.exc_info()[0
]
else
'there has lines in the file
'.format(len(f.readlines()))
finally
'end of the function
'f.close()
try語句處理異常,是這樣做的:
a. 首選,try子語句(try和except關鍵字之間的語句)會被執行。
b. 如果沒有異常發生,except 子句被略過。
c. 如果有異常發生,try後面的其他語句就被跳過了,如果異常型別在except關鍵字後匹配,這個except子句被執行。
d. 如果沒有異常發生,else子句就會被執行。else的作用是它避免了捕獲未保護的**所發起的異常。
e. finally
子語會在try子句執行完畢之前執行,不管是否發生或者不發生異常。當乙個異常發生在try子句中卻未被處理時(或者發生在except或者else子句中時),finally子句執行完後會再次丟擲異常。
這些基本的語法,應該也基本都是比較清楚的,文件裡列出了一些需要注意的地方:
第一:一次性處理多個異常時,多個異常需要用括號括起來。
except (runtimeerror, typeerror): 這樣是正確的;except runtimeerror, typeerror: 寫法是錯誤的,因為except valueerror, e 在語法上等價於except valueerror as e。
第二:最後乙個except子句可以不帶異常型別名,這樣就可以捕獲任何未被定義的異常。
第三:當乙個異常發生時,可能它還有一些異常的引數。except語句的異常名字後面可以跟乙個引數,這個引數會跟異常例項繫結,儲存在instance.args中,如果異常中__str__()
定義過了,就可以直接列印出引數了。
>>> try:... raise exception(
'spam
', '
eggs')
... except exception
asinst:
... 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
'x =
', x
'y =
', y
...'
exceptions.exception
'>(
'spam
', '
eggs')
('spam
', '
eggs')
x =spam
y = eggs
8.4 使用者自定義異常
使用者自定義的異常需要繼承exception類,官網例子如下:
>>> classmyerror(exception):
... def __init__(self, value):
... self.value =value
... def __str__(self):
...
return
repr(self.value)
...>>> try
:... raise myerror(
2*2)
... except myerror
ase:
'my exception occurred, value:
', e.value
...my exception occurred, value:
4>>> raise myerror('
oops!')
traceback (most recent call last):
file
"", line 1, in ?__main__.myerror:
'oops!
'
在這個例子中,init方法被重寫了,用於建立乙個新的成員變數value。
8.5 已定義好的清理行為
當不再需要這個物件的時候,有一些物件已經定義好了標準的清理行為,不管使用這個物件操作成功或者失敗;常見的例子還是開啟文件:
for line in open("myfile.txt"):
print line,
這段**的問題是在這段**執行後,文件處於open的狀態時間是不確定的,在乙個小的指令碼裡,這不會是乙個很嚴重的問題,但是如果是乙個大應用程式中的一部分,這個問題就會被放大。使用with語句,就允許一些像files的類在使用完後能被清理完(釋放某些資源吧,我是這樣理解的):
with open("myfile.txt
") as
f:
for line in
f: print line,
換成這行**後,f已經處於close狀態了。即使在讀檔案裡的每一行遇到錯誤,也會關閉掉。
Python學習筆記(六)
函式 呼叫python內建的函式,可以通過 help fun 進行查詢。舉例 abs x 求x絕對值 cmp x,y 比較兩個數大小,如果 xy,返回 1。int x 把其他資料型別轉換為整數,包括字串型別。str 把其他型別轉換成 str。編寫函式 def my abs x if x 0 retu...
Python學習筆記(六)
函式練習題 1 寫函式,檢查傳入字典的每乙個value的長度,如果大於2,那麼僅保留前兩個長度的內容,並將新內容返回給呼叫者。dic def dict func dic for key,value in dic.items if len value 2 value value 0 2 dic key...
Python學習筆記六
python課堂筆記六 常用模組已經可以在單位實際專案中使用,可以實現運維自動化。無需手工備份檔案,資料庫,拷貝,壓縮。常用模組 time模組 time.time time.localtime time.strftime os模組 主要針對作業系統的一些方法,如 切換目錄 sys模組 跟python...