11.Python 類別 (Class)
『物件導向程式設計』(Object-oriented programming, OOP) 是一種程式開發的概念,以物件的概念來解決問題。 封裝、繼承、多型為物件導向的三大特性,本章節會略提此概念,…
甲居工作室日期:2024/04/09
想必到目前為止應該看過許多的錯誤 (Error)訊息。然後就 88 了。此章節主要說明如何處理錯誤狀況,以防程式出錯而導致無法運行甚至發生其他狀況,如檔案毀損。
可以通過try-except語句來處理例外。 try 區塊中包含可能引發例外的程式碼,except區塊中包含處理例外的程式碼。
try:# 程式碼passexcept Exception as e:# 異常處理程式碼print(f"發生錯誤:{e}")
Exception as e:用來捕獲異常狀態並且宣告變數 e,如無需要則可省略。
try:# 程式碼passexcept SpecificException as e:# 處理特定異常的程式碼print(f"發生了 {type(e).__name__} 類型的錯誤:{e}")except AnotherSpecificException as e:# 處理另一種特定異常的程式碼print(f"發生了 {type(e).__name__} 類型的錯誤:{e}")
try:# 可能引發異常的程式碼區塊result = 10 / 2except ZeroDivisionError:print("除以零錯誤發生")else:print("沒有發生異常")print("結果是:", result)
不論例外是否發生,都需要執行某些程式,可以寫在 finally 部份 (部分時候try不會執行,例如程式被強制終止)。
try:# 可能引發異常的程式碼區塊f = open("example.txt", "r")print(f.read())except FileNotFoundError:print("檔案未找到")finally:# 無論是否發生異常都會執行的程式碼區塊if 'f' in locals():f.close() # 確保檔案被關閉print("執行結束")
預定義的清理動作,某些時候開啟或是使用資源沒有正確的關閉或釋放,該資源就會搶佔著記憶體,資源小時無感但當檔案資源很大時就會影響效率。
通常用於處理文件、資料庫連接、網路連接等需要顯式關閉或清理的資源。
with expression as variable:# 使用資源的程式碼區塊
-expression:是一個返回上下文管理器物件的表達式,通常是一個函式呼叫。
-variable:是可選的,用於將上下文管理器的結果賦值給一個變數,以便在with區塊中使用。
with open("file.txt", "r") as file:content = file.read()# 檔案會在with區塊結束時自動關閉
import sqlite3with sqlite3.connect("example.db") as conn:pass# 檔案會在with區塊結束時自動關閉
raise 語法強制引發指定的例外。例如:
raise [Exception [from previous_exception]]
-Exception:是要引發的例外類型,可以是Python內建的例外類型,也可以是自定義的例外類。
-from previous_exception:是可選的,用於在例外鏈接中指定前一個例外。
raise ValueError("無效值")
class MyCustomError(Exception):passraise MyCustomError("發生了錯誤")
在這個例子中,如果
try:some_function_that_may_raise_exception()except SomeException as e:raise AnotherException("發生了錯誤") from e
some_function_that_may_raise_exception()引發了SomeException,程式將捕獲這個異常,並且重新引發一個新的異常AnotherException,同時將原始的異常作為上下文傳遞給新的異常。假設你有一個函式從文件中讀取數字並進行除法運算:
def divide_numbers(file_path):try:with open(file_path, 'r') as f:num1 = int(f.readline().strip())num2 = int(f.readline().strip())result = num1 / num2return resultexcept FileNotFoundError as e:raise ValueError(f'無法找到文件: {file_path}') from eexcept ZeroDivisionError as e:raise ValueError('除數不能為零') from eexcept ValueError as e:raise ValueError('文件中應包含兩個整數行') from e