python編程基礎——錯誤和異常

語法錯誤

語法錯誤又稱解析錯誤,是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做一些收尾善後的工作。值得注意點是:**當tryexcept中有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)
#輸出結果
兩數不等
兩數相等
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章