(九)Python基礎知識-語法錯誤和異常

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 這些類似的異常類的介紹暫未羅列出來,在實踐中慢慢探索吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章