使用 try 與 except 來處理錯誤

  • 錯誤的方式:

    • 有一些語言指出錯誤的方式 → 用函式來回傳值
    • Python 錯誤發生時 → 使用例外,就會執行與它有關的程式
  • 【範例】Python 錯誤方式

    • 以「超出範圍的位置」來存取串列或tuple
    • 使用「不存在的鍵」來存取字典
    • 執行一段可能會「在某些情況下失敗的程式時」 → 需要使用適當的例外處理程式 → 攔截任何可能發生的錯誤
  • 優良的做法:在「任何可能發生例外的地方」添加「例外處理程式」,來讓使用者知道發生什麼情況

    • 可能無法修復問題 → 至少可以告知目前的狀況,並且優雅的關閉程式
    • 某些函式裡面出現例外,且沒有被抓到,它會被不斷上傳 → 直到「呼叫方的函式」裡面的「處理程式」抓到為止
    • 如果沒有提供自己的例外處理程式 → Python 會印出一個錯誤訊息與一些資訊:告訴你錯誤發生在什麼地方 → 接著「終止程式」

沒有提供自己的例外處理程式 → Python 會印出一個錯誤訊息與一些資訊

>>> 串列名稱 = [數字1, 數字2, 數字3]
>>> position = 5
>>> 串列名稱[position]
錯誤訊息及資訊
>>> short_list = [1, 2, 3]
>>> position = 5

>>> short_list[position]
Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    short_list[position]
IndexError: list index out of range

使用 try 包住程式,用 except 處理錯誤 → 而不是將它交給命運安排

  • 用 except 處理錯誤 1.指定一般的 except,不帶任何引數 → 可以捕捉到任何類型的例外

    • 使用單純的 except 來捕捉所有的例外 → 處理它們的方式可能會很籠統(類似印出發生某些錯誤這類文字)

      2.出現兩種以上類型的例外 → 最好提供個別的例外處理程式

    • 可以使用任何數量的專用例外處理程式
>>> 串列名稱 = [數字1, 數字2, 數字3]
>>> position = 5

# try 段落內的程式會先執行
# 如果有錯誤,就會發出例外,並且執行 except 段落內的程式
# 如果沒有錯誤,except 段落就會跳過
>>> try:
        串列名稱[position]
    except:
        print('文字1', len(串列名稱)-1, ' 文字2', position)

文字1 2 文字2 5
>>> short_list = [1, 2, 3]
>>> position = 5
>>> try:
        short_list[position]
    except:
        print('Need a position between 0 and', len(short_list)-1, ' but got', position)

Need a position between 0 and 2  but got 5

在變數 name 中取得完整的例外物件

有時想要得知該類型之外的例外細節 → 使用此格式,可以在變數 name 中取得完整的例外物件

except exceptiontype as name

>>> 串列名稱 = [數字1, 數字2, 數字3]
>>> while True:
        變數1 = input('文字1?')
        if 變數1 == '文字2':
            break
        try:
            變數2 = int(變數1)
            print(文字3)
        except IndexError as 變數3:
            print('文字4:' 變數2)
        except Exception as 變數4:
            print('文字5:', 變數4)

文字1?  1
數字2

文字1?  0
數字1

文字1?  2
數字3

文字1?  3
文字4: 3

文字1?  two
文字5: two
>> short_list = [1, 2, 3]
>>> while True:
    value = input('Position [q to quit]? ')
    if value == 'q':
        break
    try:
        position = int(value)
        print(short_list[position])
    except IndexError as err:                     # 會先查看 IndexError,當「提供非法位置」給序列時 → 會出現這種「例外類型」
        print('Bad index:', position)
    except Exception as other:                    # 將「IndexError 例外」存在「變數 err」裡面;將「其他所有例外」存在「other變數」裡面
        print('Something else broke:', other)     # 印出 → 所有存在 other 裡面的東西,來讓你知道這個物件裡面有什麼

Position [q to quit]? 1
2
Position [q to quit]? 0
1
Position [q to quit]? 2
3
Position [q to quit]? 3                           # 輸入位置 3 → 會發出例外 IndexError
Bad index: 3
Position [q to quit]? two                         # 對 int()函式輸入干擾的 two,第二個例外的 except 程式會處理它 → 第二個負責捕捉所有的 except 程式
Something else broke: invalid literal for int() with base 10: 'two'
Position [q to quit]? q

results matching ""

    No results matching ""