所謂語法錯誤,也就是你寫的**不符合程式設計規範,無法被識別與執行,比如下面這個例子:
if name is not none
print(name)
if 語句漏掉了冒號,不符合 python 的語法規範,所以程式就會報錯invalid syntax
。
異常則是指程式的語法正確,也可以被執行,但在執行過程中遇到了錯誤,丟擲了異常,比如下面的 3 個例子:
10 / 0
traceback (most recent call last):
file "", line 1, in zerodivisionerror: integer division or modulo by zero
order * 2
traceback (most recent call last):
file "", line 1, in nameerror: name 'order' is not defined
1 + [1, 2]
traceback (most recent call last):
file "", line 1, in typeerror: unsupported operand type(s) for +: 'int' and 'list'
異常列表參考文件
filenotfounderror
keyerror
importerror
indexerror # 索引越界異常,如果 index 不是整數報 typeerror
keyerror # 是指字典中的鍵找不到
keyboardinterrupt # control-c 捕捉
nameerror # 區域性或者全域性變數沒有找到
unicodeencodeerror
unicodedecodeerror
exception valueerror
zerodivisionerror
fileexistserror
filenotfounderror
interruptederror
isadirectoryerror
notadirectoryerror
permissionerror
第一種寫法
try:
db = db.connect('') # 可能會丟擲異常
try:
raw_data = db.querydata('') # 可能會丟擲異常
except dbquerydataerror as err:
print('db query data error: {}'.format(err))
except dbconnectionerror as err:
print('db connection error: {}'.format(err))
except:
print('unexpected error:', sys.exc_info()[0])
finally:
pass
需要注意,當程式中存在多個 except block 時,最多只有乙個 except block 會被執行。換句話說,如果多個 except 宣告的異常型別都與實際相匹配,那麼只有最前面的 except block 會被執行,其他則被忽略。
第二種寫法
try:
db = db.connect('') # 可能會丟擲異常
raw_data = db.querydata('') # 可能會丟擲異常
except (dbconnectionerror, dbquerydataerror) err:
print('error: {}'.format(err))
except:
print('unexpected error:', sys.exc_info()[0])
finally:
pass
兩種寫法實現的效果是一致的,但第二種寫法更簡潔
異常處理中,還有乙個很常見的用法是 finally,經常和 try、except 放在一起來用。無論發生什麼情況,finally block 中的語句都會被執行,哪怕前面的 try 和 except block 中使用了 return 語句。
前面的例子裡充斥了很多 python 內建的異常型別,下面這個例子,建立了自定義的異常型別 myinputerror,定義並實現了初始化函式和 str 函式(直接 print 時呼叫):
class myinputerror(exception):
"""exception raised when there're errors in input"""
def __init__(self, value): # 自定義異常型別的初始化
self.value = value
def __str__(self): # 自定義異常型別的string表達形式
return ("{} is invalid input".format(repr(self.value)))
try:
raise myinputerror(1) # 丟擲myinputerror這個異常
except myinputerror as err:
print('error: {}'.format(err))
error: 1 is invalid input
python基礎 語法錯誤和異常
try 可能出現異常的 except 如果有異常執行的 finally 無論是否存在異常都會被執行的 注意 異常型別的順序要注意,最大的exception放在最後。err表示的是錯誤的原因。ef func try n1 int input 輸入第乙個數字 n2 int input 輸入第二個數字 s...
python基礎之錯誤和異常處理
import exception exce 在捕獲錯誤異常的時候 是要根據具體的錯誤型別來捕獲的 用乙個塊 可以捕獲多個不同型別的異常 exception 可以捕獲所有異常 當對出現的問題或者錯誤不確定的情況下 可以使用此種 print dir exception try print b 捕獲邏輯的...
python錯誤和異常
1 語法錯誤 syntax errors 語法錯誤,也就是解析時錯誤。當我們寫出不符合python語法 時,在解析時會報syntaxerror,並且會顯示出錯的那一行,並用小箭頭知名指明最早探測到錯誤的位置。如 while ture file line 1 while ture syntaxerro...