例外處理

Python SELF TW
等級 17 , 課堂 2
開放

3.1 捕捉例外

我們不會只是看著例外這麼簡單就結束的。例外是一些特殊的物件,你的 Python 程式可以跟它們互動。例外處理是編程中很重要的一部分,可以提升程式的可靠性和穩定性。

在 Python 中,要捕捉和處理例外,你會用到 try, except, else, 和 finally 這些結構。這些結構可以讓你在程式執行時抓到錯誤,再做出適當的操作。

結構 try-except

try-except 結構用來捕捉和處理例外。try 區塊包含可能拋出例外的程式碼,而 except 區塊則包含在例外發生時會執行的程式碼。

例子:


try:
    result = 10 / 0
except ZeroDivisionError:
    print("錯誤: 除數是零。")

如果 try 區塊中的程式碼拋出 ZeroDivisionError 例外,它會被 except 區塊捕捉到,然後執行 print() 函數。

處理多個例外

你可以在不同的 except 區塊中處理不同型別的例外。


try:
    result = int("abc")
except ZeroDivisionError:
    print("錯誤: 除數是零。")
except ValueError:
    print("錯誤: 不正確的值。")

捕捉所有例外

如果你想捕捉所有例外,可以用不加特定例外類型的 except 區塊。然而不建議這樣做,因為這可能會影響除錯並隱藏重要的錯誤。


try:
    result = 10 / 0
except:
    print("發生錯誤。")

3.2 elsefinally 運算符

除了 tryexcept,還有兩個可選的: elsefinally。現在我來稍微解釋一下它們。

結構 try-except-else

else 區塊 用在 try 區塊沒有例外發生時執行程式碼。


try:
    result = 10 / 2
except ZeroDivisionError:
    print("錯誤: 除數是零。")
else:
    print(f"結果: {result}")

結構 try-except-finally

finally 區塊 會執行不論有無例外發生的程式碼。這很有用於釋放資源或完成清理工作。


try:
    result = 10 / 0
except ZeroDivisionError:
    print("錯誤: 除數是零。")
finally:
    print("這個區塊永遠會執行。")

完整例子: try-except-else-finally

例子:


try:
    result = 10 / 2
except ZeroDivisionError:
    print("錯誤: 除數是零。")
else:
    print(f"結果: {result}")
finally:
    print("這個區塊永遠會執行。")

3.3 try-except-else-finally 的例子

讓我們來看看一個大一些的實際例子。假如我們嘗試從硬碟中讀取數據,這能有多難?


file = open("file.txt", "r")
content = file.read()
print(content)

可能出什麼問題呢?例如:

  • 檔案可能不存在。它可能被意外刪除、未寫入,或你的程序運行在沒有它的另一台電腦上。
  • 檔案讀取錯誤。你的程式可能沒有對它的訪問權限,因為它位於需要管理員權限的目錄中。
  • 另一個程式現在正在寫入此檔,無法讀取——它對檔案擁有獨占訪問權。

還不夠嗎?別忘了,不論在哪個步驟發生錯誤,都必須「關閉」檔案,好讓作業系統釋放資源。

所以真實的程式碼可能會像這樣:


try:
    file = open("non_existent_file.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("錯誤: 檔案未找到。")
except IOError:
    print("錯誤: 輸入輸出錯誤。")
else:
    print(content)
finally:
    if 'file' in locals() and not file.closed:
        file.close()
        print("檔案已關閉。")

歡迎來到現實世界,不僅需要寫「工作場景」的代碼,還需要為可能出錯的所有情況寫代碼。

放心,這其實沒那麼可怕。只需理解什麼是邊界條件(corner cases),並及時新增對常見錯誤的檢查即可。其他的現代框架會幫你完成。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION