1、語法錯誤
語法錯誤是我們在編寫程序時,缺少一些關鍵字或者符號,直接導致程序編譯都無法通過,會報SyntaxError錯誤。
舉個例子:
if True
print("上述語句有1處語法錯誤:缺少關鍵符號(冒號:)")
輸出結果:
可以很明顯的看到 if True 後面缺少一個:號,這些都是python語法規定的,如果繼續運行程序會報SyntaxError錯誤,這就是所謂的語法錯誤。
其實發生語法錯誤時,很多時候PyCharm編譯器會自動標紅提示,而不必等到運行之後發現。
2、異常
異常是指,程序語法是正確的,但是在運行的時候發生了錯誤,導致程序可能意外終止,這個錯誤可以理解爲異常,這種異常需要進行捕獲處理。
關於捕獲異常,主要有以下三種處理方式:
- try except 捕獲語句
- raise 拋出語句
- assert(斷言)語句
2.1、try except 捕獲語句
try except捕獲語句有多種結構。
2.1.1、第一種:
語句結構:
try:
# 執行語句
except Exception:
# 發生異常時執行的語句
舉個例子:
try:
numer = 1
print("12" + numer)
except TypeError:
print("發生異常時執行的語句")
輸出:
發生異常時執行的語句
其中TypeError是可以改變爲其他的異常類型
2.1.2、第二種:
語句結構:
try:
# 執行語句
except Exception:
# 發生異常時執行的語句
else:
# 沒有異常時執行的語句
舉個例子:
try:
numer = 1
print("12" + numer)
except TypeError:
print("發生異常時執行的語句")
else:
print("沒有異常時執行的語句")
輸出:
發生異常時執行的語句
讀者可以將上面的+號改成,號,即可看到執行else分支裏面打印信息。
2.1.3、第三種:
語句結構:
try:
# 執行語句
except Exception:
# 發生異常時執行的語句
else:
# 沒有異常時執行的語句
finally:
# 不管有沒有異常都要執行的語句
舉個例子:
try:
numer = 1
print("12" + numer)
except TypeError:
print("發生異常時執行的語句")
else:
print("沒有異常時執行的語句")
finally:
print("不管有沒有異常都要執行的語句")
輸出:
發生異常時執行的語句
不管有沒有異常都要執行的語句
2.1.4、其他捕獲語句:
去掉else的語句結構:
try:
# 執行語句
except Exception:
# 發生異常時執行的語句
finally:
# 不管有沒有異常都要執行的語句
支持元組異常類型捕獲的語句結構:
try:
# 執行語句
except (Exception1, Exception2, Exception3):
# 發生異常時執行的語句
支持多個異常類型捕獲的語句結構:
try:
# 執行語句
except Exception1:
# 發生異常時執行的語句
except Exception2:
# 發生異常時執行的語句
...
2.2、raise 拋出語句
語句結構:
raise Exception (msg)
msg:拋出的字符串信息
舉個例子:
# 定義一個除法函數
def div(agr1, arg2):
if arg2 == 0:
raise ZeroDivisionError("除數不能爲0")
return agr1 / arg2
# 調用除法函數捕獲div函數上拋的異常
try:
res = div(1, 0)
print(res)
except ZeroDivisionError as ex:
print("捕獲異常:", ex.args[0])
輸出:
捕獲異常: 除數不能爲0
raise可以用來拋出自定義的異常,關於自定義異常需要學習面向對象後再來舉例。
2.3、assert(斷言)語句
語句結構:
assert expression
assert(斷言)語句用於判斷一個表達式,在表達式條件爲 false 的時候觸發異常。
斷言可以在條件不滿足程序運行的情況下直接返回錯誤,而不必等待程序運行後出現崩潰的情況。
在Android裏面可以用斷言函數做單元測試。
舉個例子:
#斷言函數舉例
assert 1<2 # 條件爲 true 正常執行
print("1比2小")
assert 1>2 # 條件爲 false 觸發異常
print("1比2大")
print("判斷結束")
輸出:
可以看出:
第一個斷言語句,返回true,打印出了結果;
第二個斷言語句,返回false,直接觸發AssertionError異常,程序終止,不再往下執行。
3、總結
其實異常的捕獲與java非常之類似,且可以在except後跟異常元組這個用法確實比較厲害;
其次else分支也算是Python獨有的吧;
raise更多適用於自定義異常的場景;
對於斷言語句第一次在Python中瞭解了它的用法,之前在java中還沒有怎麼使用過。
文中關於 TypeError 、AssertionError、NameError 這些類似的異常類的介紹暫未羅列出來,在實踐中慢慢探索吧。