Skip to content

[Python] 基本教學(13) 錯誤處理:try & except

在寫程式的過程中,總難免會有疏漏造成 BUG。

有時候,就算我們將程式執行時可能的任何狀況都預想到了,卻常常還是有一些我們根本沒有想到的情況發生,造成我們的程式產生錯誤,甚至讓我們辛苦寫好、想要讓其持續執行一段時間的程式在執行過了一段時間後發生了錯誤,而我們根本不知道。

理所當然,這種情況發生的時候會拖慢我們專案的完成進度,所以,在寫程式的時候考慮『錯誤』並迴避,便是一件相當重要的事情。

今天要紀錄的,便是 Python 程式語言中的 try 和 except。

顧名思義,我們執行的程式的時候可以將程式碼放置於『try』的部份,然後在錯誤發生的時候,我們會由『except』的地方開始繼續往下執行。

無聊的敘述該結束啦。以下便來看看實際的程式碼吧!


Try & Except

我們來看看一個錯誤:

for n in range(10) print(n)


Output:

for n in range(10) print(n)
                       ^
SyntaxError: invalid syntax

以上就是一個簡單的報錯!

講說簡單也很奇怪,但這是一個很多人常見的錯誤:在使用 for-loop 時忘記使用 “:” 分開『for-loop』以及『要執行的程式碼』。

我們修正這個 BUG:

for n in range(10):
    print(n)


Output:

0
1
2
3
4
5
6
7
8
9

修正了我們剛剛寫錯的部份,Python 的程式碼馬上就開始正常執行了。

但我們得正視一個問題:我們在開發程式的過程中如果遇到了 BUG,我們難道能不計代價(比如說熬夜、老闆因軟體開發進度不足發火)就這樣把程式丟著,等到真的遇到無法執行的場景才發現某種特定的問題嗎?

這就是我們得使用 try 和 except 的時候了。

我們首先還是來看一個簡單的範例:

try:
    hello()
except:
    print('無法這樣執行程式碼!')


Output:

無法這樣執行程式碼!

這裡先說明: hello() 是程式碼前面所沒有定義過的 function,然後我們便呼叫了它。

這本來會產生一個錯誤訊息的,但我們使用了 try & except 迴避了這個問題。這個報錯使我們程式不再執行有問題的程式,改成執行 except 底下的程式,告知我們發生錯誤了。


應用

假設我們在執行一個自動化的任務,比方說股票爬蟲(關於什麼是『爬蟲』,可能初學程式的時候還不算太熟,故我在這裡簡單介紹一下:基本上就是讓程式去網路上,把想要的網頁資料下載下來。)

那麼這時候,我們偏偏抓到一個網頁是死掉的,連連線都拒絕掉,使我們的爬蟲程式發生錯誤。

這時候 try & except 就是非常方便的工具,能讓我們暫時先略過會發生錯誤的某一個網頁。

除此之外,try & except 也能讓我們使用鍵盤離開的報錯顯示地比較乾淨。

try:
    for n in range(99999999):
        print(n)
except KeyboardInterrupt:
    print('GoodBye. My Lord.')


Output:

 1705
 1706
 1707
 1708
 1709
 1710
 1711
 1712
 1713
 1714
 1715
 1716
 1717
 1718
 1719
 1720
 1721
 1722
 1723
 1724
 1725
 1726
 GoodBye. My Lord.

在程式執行到印出 1726 的時候我按了 ctrl + c 來中斷程式。本來程式會產生一大堆報錯,越大型的程式報錯看起來越雜亂,而若使用 except 來抓住這種類型的報錯,就可以讓我們的版面維持整潔。

歡迎大家也多使用 try & except 在自己的專案上!這在開發上肯定有很多幫助的!


討論

除了 try、except 這樣的指令外,其實還存在著 final、raise 等等各式各樣的指令幫助我們處理錯誤訊息、甚至拋出錯誤 —— 這些都是很實用的功能,不過大體上,我們都需要實際碰過才知道這些功能的好用。

希望大家都能在程式設計中找到樂趣,並且順利完成自己的所有專案。


References


Read More

Leave a Reply