語法錯誤
語法錯誤又稱解析錯誤,是python學習中最常遇到的錯誤:
def fuc
^
SyntaxError: invalid syntax
解析器會輸出出現語法錯誤的那一行,並顯示一個“箭頭”,指向這行裏面檢測到第一個錯誤。 (此例爲函數缺少 ‘:’)
異常
常見的異常
異常 | 描述 |
---|---|
NameError | 嘗試訪問一個沒有申明的變量 |
ZeroDivisionError | 除數爲0 |
SyntasError | 語法錯誤 |
IndexError | 索引超出序列範圍 |
KeyError | 請求一個不存在的字典關鍵字 |
IOError | 輸入/輸出錯誤 |
AttributeError | 嘗試訪問位置的對象屬性 |
- NameError
#未對變量綁定對象直接使用.
n
NameError: name 'n' is not defined
- ZeroDivisionError
#零作分母
1/0
ZeroDivisionError: division by zero
- SyntaxError
#函數沒有冒號
def fuc
^
SyntaxError: invalid syntax
- IOError
#打開不存在的文件
f = open("text")
FileNotFoundError: [Errno 2] No such file or directory: 'text'
- AttributeError
#使用未定義的屬性
a.m
AttributeError: 'A' object has no attribute 'm'
處理異常
爲了保證代碼的健壯性,有時我們需要對一些由用戶操作不當而引起的一些異常做處理。這就需要用到異常處理語句。
try…except…
對於try...except...
語句,如果try
子語句有異常發生,則直接跳到except部分。下面我們對於該語句的幾種情況來:
- 不管什麼異常,都執行except
#except後不跟任何異常類型
try:
1/0
except:
print("分母不能爲零")
- 執行指定異常
# 產生的異常不是 except語句後跟的異常
try:
1/0
except IOError:
print("IOError錯誤")
# 運行結果
1/0
ZeroDivisionError: division by zero
#產生的異常是except語句後跟的異常
try:
1/0
except ZeroDivisionError:
print("ZeroDivisionError錯誤")
#運行結果
ZeroDivisionError錯誤
- 多個except
# 有多個except,try裏面遇到一個異常,就轉到相應的except子句
try:
a
except ZeroDivisionError:
print("ZeroDivisionError錯誤")
except NameError:
print("NameError錯誤")
# 運行結果
NameError錯誤
#當然這樣也是可以的
try:
a
except (ZeroDivisionError,NameError):
print("ZeroDivisionError或NameError錯誤")
# 運行結果
ZeroDivisionError或NameError錯誤
- 打印默認錯誤提示
# 對於單個異常
try:
1/0
except ZeroDivisionError as error:
print(error)
#對於多個異常
try:
1/0
except (ZeroDivisionError,IOError) as error:
print(error)
#對於所有異常
try:
1/0
except Exception as error:
print(error)
#運行結果
division by zero
else子句
除了try...except...
句式以外,還有try...except...else...
,之行過程是如果try
子句能後正常運行,那麼就執行else
子句。
try:
口/口
except Exception as error:
print(error)
else:
print("try子句成功運行")
# 1/0輸出結果
division by zero
#2/1輸出結果
try子句成功運行
下面給出一個關於else的例子,計算兩數和
while True:
a=input("請輸入A:")
b=input("請輸入B:")
try:
c=int(a)/int(b)
except Exception as ex:
print("輸入有誤:",ex)
else:
print("結果爲:",c)
break
#輸出結果
請輸入A:2
請輸入B:0
輸入有誤: division by zero
請輸入A:2
請輸入B:1
結果爲: 2.0
finally子句
有了finally
,不管前面執行的是try
,還是except
,最終都要之行它。因此我們可以利用finally
做一些收尾善後的工作。值得注意點是:**當try
和except
中有return
時,在執行到return
之前會跳轉至finally
子句執行,直至執行完。
def func(a,b):
try:
a/b
print("try子句")
return 0
except:
print("except子句")
return 1
finally:
print("finally子句")
return 2
print(func(1,0))
print(func(1,1))
#運行結果
except子句
finally子句
2
try子句
finally子句
2
#若把finally中的return去掉,則輸出爲
except子句
finally子句
1
try子句
finally子句
0
assert語句
assert主要用來判斷真假,如果爲真則正常執行,如果爲假則拋出異常。
assert True #正常執行
assert False #拋出異常
def func(a,b):
try:
assert a==b
print("兩數相等")
except:
print("兩數不等")
func(1,0)
func(1,1)
#輸出結果
兩數不等
兩數相等