python學習筆記系列 (六)錯誤和異常

2022-07-08 13:21:37 字數 4396 閱讀 6216

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:

print

'i/o error():

'.format(e.errno,e.strerror)

except valueerror:

print

"could not convert data to integer

"except:

print

"unexpected error:

",sys.exc_info()[0

]

else

: print

'there has lines in the file

'.format(len(f.readlines()))

finally

: print

'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

... print

'x =

', x

... print

'y =

', y

...'

exceptions.exception

'>(

'spam

', '

eggs')

('spam

', '

eggs')

x =spam

y = eggs

8.4 使用者自定義異常

使用者自定義的異常需要繼承exception類,官網例子如下:

>>> class

myerror(exception):

... def __init__(self, value):

... self.value =value

... def __str__(self):

...

return

repr(self.value)

...>>> try

:... raise myerror(

2*2)

... except myerror

ase:

... print

'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...