iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
Software Development

跟著 OXXO 一起學 Python系列 第 24

( Day 12.1 ) Python 例外處理 ( try、except )

  • 分享至 

  • xImage
  •  

執行 Python 程式的時候,往往會遇到「錯誤」的狀況,如果沒有好好處理錯誤狀況,就會造成整個程式壞掉而停止不動,因此,透過「例外處理」的機制,能夠在發生錯誤時進行對應的動作,不僅能保護整個程式的流程,也能夠掌握問題出現的位置,馬上進行修正。

原文參考:例外處理 ( try、except )

本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

使用 try 和 except

下方的例子執行後,會發生「TypeError」的錯誤 ( 因為輸入的是文字,文字無法和數字相加 ),也因為發生錯誤,進而造成程式停止,後方程式無法正常執行。

a = input('輸入數字:')
print(a + 1)       # 發生錯誤
print('hello')      # 因為發生錯誤,造成程式停止,所以後方程式無法執行

Python 教學 - 例外處理 ( try、except )

如果要避免程式因錯誤而停止,可使用 try 和 except 進行保護 ( 或測試 ),當 try 區段內的程式發生錯誤時,就會執行 except 裡的內容,如果 try 的程式沒有錯誤,就不會執行 except 的內容,當程式修改成下面的樣子,就會順利印出後方的 hello。

try:                      # 使用 try,測試內容是否正確
    a = input('輸入數字:')
    print(a + 1)
except:                   # 如果 try 的內容發生錯誤,就執行 except 裡的內容
    print('發生錯誤')
print('hello')

Python 教學 - 例外處理 ( try、except )

加入 pass 略過

在撰寫 try... except 有時候會遇到「不想做任何動作」的狀況 ( 連 print 都不想使用 ),這時可以使用 pass 語法來略過 ( 什麼事情都不做 ),以下方的程式而言,當發生錯誤時,進入 excpet 後就會直接忽略並跳過。

try:                      # 使用 try,測試內容是否正確
    a = input('輸入數字:')
    print(a + 1)
except:                   # 如果 try 的內容發生錯誤,就執行 except 裡的內容
    pass                  # 略過
print('hello')

except 的錯誤資訊

只要程式發生錯誤,控制台中都會出現對應的錯誤資訊,下方列出常見的幾種錯誤資訊 ( 詳細錯誤資訊參考:Built-in Exceptions ):

錯誤資訊 說明
NameError 使用沒有被定義的對象
IndexError 索引值超過了序列的大小
TypeError 數據類型 ( type ) 錯誤
SyntaxError Python 語法規則錯誤
ValueError 傳入值錯誤
KeyboardInterrupt 當程式被手動強制中止
AssertionError 程式 asset 後面的條件不成立
KeyError 鍵發生錯誤
ZeroDivisionError 除以 0
AttributeError 使用不存在的屬性
IndentationError Python 語法錯誤 ( 沒有對齊 )
IOError Input/output異常
UnboundLocalError 區域變數和全域變數發生重複或錯誤

下面的程式執行時,因為變數 a 還沒被定義,所以會進入 except NameError 的區段,印出「使用沒有被定義的對象」。

try:
    print(a)
except TypeError:
    print('型別發生錯誤')
except NameError:
    print('使用沒有被定義的對象')
print('hello')

Python 教學 - 例外處理 ( try、except )

如果不知道錯誤的型別,只想印出錯誤資訊,除了單純用 except,也可以使用「except Exception」,將例外的資訊全部放在裡面。

try:
    print(1/0)
except TypeError:
    print('型別發生錯誤')
except NameError:
    print('使用沒有被定義的對象')
except Exception:
    print('不知道怎麼了,反正發生錯誤惹')
print('hello')

Python 教學 - 例外處理 ( try、except )

如果單純使用 except Exception as e,也能將所有的錯誤資訊全部印出

try:
    a = 1
    b = '1'
    print(a+b)
except Exception as e:
    print(e)

Python 教學 - 例外處理 ( try、except )

raise 和 assert

在執行 try 的過程中,如果遇到需要「強制中斷」的情形,可使用 raise 強制中斷。

try:
    a = int(input('輸入 0~9:'))
    if a>9:       # 如果輸入的 a 大於 9
        raise       # 強制中斷,拋出錯誤資訊席
    print(a)
except :
    print('有錯誤喔~')   # 收到錯誤訊息,顯示錯誤

Python 教學 - 例外處理 ( try、except )

raise 後方可以加上錯誤資訊,錯誤資訊可以包含要呈現的訊息,以下方的例子而言,強制停止時回報 ValueError 資訊,接著使用 except 區隔錯誤資訊,就能呈現真實的錯誤狀況。

try:
    a = int(input('輸入 0~9:'))
    if a>10:
        raise ValueError('數字不在範圍內')
    print(a)
except ValueError as msg:    # 如果輸入範圍外的數字,執行這邊的程式
    print(msg)
except :                     # 如果輸入的不是數字,執行這邊的程式
    print('有錯誤喔~')
print('繼續執行')

Python 教學 - 例外處理 ( try、except )

使用 assert 中斷的方法為「assert False, '錯誤訊息'」,用法和 raise 類似,執行後就會中斷程式,並將錯誤資訊提供給 except 顯示,下方的程式如果輸入 123,會執行 AssertionError 裡的程市,如果輸入 abc 則會執行 except 裡的程式。

try:
    a = int(input('輸入 0~9:'))
    if a>10:
        assert False, '數字不在範圍內'
    print(a)
except AssertionError as msg:
    print(msg)
except :
    print('有錯誤喔~')
print('繼續執行')

Python 教學 - 例外處理 ( try、except )

加入 else 和 finally

在 except 結束後,可以加入 else 或 finally 兩個額外的判斷,else 表示完全沒有錯誤,就會執行該區塊的程式,finally 則不論程式對錯,都會執行該區塊的程式

try:
    a = int(input('輸入 0~9:'))
    if a>10:
        raise
    print(a)
except :
    print('有錯誤喔~')
else:
    print('沒有錯!繼續執行!')       # 完全沒錯才會執行這行
finally:
    print('管他有沒有錯,繼續啦!')    # 不論有沒有錯都會執行這行 

Python 教學 - 例外處理 ( try、except )

更多教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 11.3 ) Python 生成式 ( 串列、字典、集合、元組 )
下一篇
( Day 12.2 ) Python 內建函式 ( eval 和 exec )
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言