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 else
和 finally
運算符
除了 try
和 except
,還有兩個可選的: else
和 finally
。現在我來稍微解釋一下它們。
結構 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
),並及時新增對常見錯誤的檢查即可。其他的現代框架會幫你完成。
GO TO FULL VERSION