python的嘗試try與錯誤error處理

星期五 17 May 2019   even  
教學

前言

The Zen of Python中的其中一句:

Errors should never pass silently. Unless explicitly silenced.

錯誤絕對不能安靜地通過,除非錯誤的很明確地緘默。在執行一個python程式,會先檢查縮排(indentation)、語法(indentation),如果都沒錯,就會開始逐行往下執行,途中如果遇到錯誤,整個程式就會在錯誤的地方完全中斷,並且在視窗中告訴你錯誤位置與種類。python的所有錯誤列表請參考官方文件

在實際以迴圈執行執行某段python的程式碼時,經常無法預期程式碼不會遇到錯誤,例如: 不小心在list放入了0,而導致ZeroDivision Error。為了避免這種情況,python提供的方法就是本章節要介紹的Try。

Try

讓程式嘗試去執行這段程式碼,如果出錯了,則執行某段程式碼,就是python最基本的try - except的用法,我以ZeroDivision Error來作範例:

首先,製造出一個會出現ZeroDivisionError的情況,將-3到3的數值放到分母內,因此程式會斷在i = 0的位置。

for i in range(-3,3):
    print(10/i)

-3.3333333333333335
-5.0
-10.0
Traceback (most recent call last):
File "<stdin>", line 2, in <module
ZeroDivisionError: division by zero

因為程式中斷,所以之後i = 1 , 2沒有被執行。要如何跳過i = 0的情況呢?可以使用以下的程式碼,強制將ZeroDivisionError緘默。

for i in range(-3,3):
    try:
        print(10/i)
    except ZeroDivisionError:
        print('Zero Division Error caused this program freeze')

-3.3333333333333335
-5.0
-10.0
Zero Division Error caused this program freeze
10.0
5.0

避免掉i = 0的同時,i = 1 , 2有繼續執行下去。

如果你不確定會是哪種錯誤,又想將錯誤的種類print出來,可以用這段程式:

for i in range(-3,3):
    try:
        print(10/i)
    except Exception as e:
        print(f'An Error occurred: {e}')

-3.3333333333333335
-5.0
-10.0
An Error occurred: division by zero
10.0
5.0

以上就是try-except 最簡單的用法,同時還有更完整的使用方式,try-except-else-finally。

try except else finally

完整的try except else finally同時使用時各自的功能如下:

Keyword 功能
try 檢查時否會出錯的程式碼段落
except 如果錯誤,依據錯誤的種類分別處理
else 如果都沒錯誤,則會執行此區段
finally 不論如何都會執行此區段

範例如下:

def full_test(x):
    try:
        result = 1/x
    except TypeError:
        print(f'你是不是將非數值型態的變數放進去了呢?')
    except Exception as e:
        print(f'你遇到了還沒定義要如何處理的錯誤: {e}')
    else:
        print(f'你運算的結果是: {result}')
    finally:
        print('執行結束~')
        print('***********************')
    
full_test('one')
full_test(0)
full_test(31)

你是不是將非數值型態的變數放進去了呢?
執行結束~
***********************
你遇到了還沒定義要如何處理的錯誤: division by zero
執行結束~
***********************
你運算的結果是: 0.03225806451612903
執行結束~
***********************

Bonus Tip: 強制產生錯誤並中斷 raise & assert

如果你希望在某種情況發生時,強制中斷程式,可以使用raise或assert,簡單用法如下:

raise SomeError

assert False, 'Error Message'

raise ValueError

Traceback (most recent call last):

File "<ipython-input-25-e4c8e09828d5>", line 1, in <module>
raise ValueError

ValueError

assert False, 'Test Assert'

Traceback (most recent call last):

File "<ipython-input-28-62d09c368cb1>", line 1, in <module>
assert False, 'Test Assert'

AssertionError: Test Assert

結語

以上就是python的try以及error處理。能保護你的程式免於出現一些無法預期的bug,非常的實用。

在實際開發程式時,越早出現error越好處理,你不會想在幾千行的程式碼中debug,非常痛苦,因此,適時的插入error,讓所有可能的異常盡早出現,才能有效的簡短開發時程。

感謝您耐心閱讀到最後,希望這篇文章能讓您在開發python程式時更加得心應手,我們下次見~

python新手教學
Why python
Hello Python!
This is a python - 基本數值運算與邏輯判斷
[Python, 的, list, 教學 ]
"python的字串教學"
python的迴圈與流程控制
python的(tuple)與{dict}
def 一個python的自訂函數:
import套件到你的python
python的嘗試try與錯誤error處理
Python之禪

相關文章:

>