Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

0

Share

Download to read offline

例外處理

Download to read offline

使用 try、except 處理例外
認識例外繼承架構
認識 raise 使用時機
運用 finally 清除資源
使用 with as 管理資源

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to like this

例外處理

  1. 1. 7. 例外處理 • 學習目標 – 使用 try、except 處理 例外 – 認識例外繼承架構 – 認識 raise 使用時機 – 運用 finally 清除資源 – 使用 with as 管理資源 2
  2. 2. 使用 try、except 3
  3. 3. 4
  4. 4. • 嘗試執行 try 區塊中的程式碼 • 如果發生例外,執行流程會跳離例外發生 點,然後比對 except 宣告的型態 • 如果符合引發的例外物件型態,就執行 except 區塊中的程式碼 5
  5. 5. • 在 Python 中,例外並不一定是錯誤 • 使用 for in 語法時,其實底層就運用到 了例外處理機制 • 只要是具有 __iter__() 方法的物件,都 可以使用 for in 來迭代 • 沒有下一個元素時, 會引發 StopIteration 例外 6
  6. 6. • 可以使用 iter() 方法呼叫物件上的 __iter__() 取得迭代器 • 可以使用 next() 來呼叫迭代器的 __next__()方法 7
  7. 7. • for in 會在遇到 StopIteration 時, 靜靜地結束迭代 8
  8. 8. • except 之後可以使用 tuple 指定多個物件, 也可以有多個except • 如果沒有指定 except 後的物件型態,表示 捕捉所有引發的物件 9
  9. 9. • 當程式中發生例外時,流程會從例外發生 處中斷,並進行 except 的比對, • 如果有相符的例外型態,就會執行對應的 except 區塊 • 執行完畢後若仍有後續的流程,就會繼續 執行 10
  10. 10. 11
  11. 11. 例外繼承架構 • 如果一個例外在 except 的比對過程中, 就符合了某個例外的父型態,後續即使有 定義了 except 比對子型態例外,也等同 於沒有定義 12
  12. 12. • 例外都是 BaseException 的子類別 • 當使用 except 而沒有指定例外型態時, 實際上就是比對 BaseException 13
  13. 13. 14
  14. 14. 15
  15. 15. 16
  16. 16. • Python 中的例外並非都是錯誤 – StopIteration – KeyboardInterrupt – SystemExit – GeneratorExit 17
  17. 17. • 如果想要自訂例外,不要直接繼承 BaseException • 應該繼承 Exception,或者是 Exception 的相關子類別來繼承 18
  18. 18. 引發(raise)例外 19
  19. 19. • 想讓呼叫方知道因為某些原因,而使得流 程無法繼續而必須中斷時,可以引發例外 • 可以使用 raise,之後指定要引發的例外 物件或型態 • 只指定例外型態的時候,會自動建立例外 物件 20
  20. 20. 21
  21. 21. 22
  22. 22. • 可以為自己的 API 建立一個根例外,商務 相關的例外都可以衍生自這個根例外 • 這可以方便 API 使用者必要時,在 except 時使用你的根例外來處理 API 相關的例外 23
  23. 23. • 例外並沒有真的被解決,只是留下了一些 日誌訊息,問題還是要向上呈現 24
  24. 24. • 若重新引發例外時,想要使用自訂的例外 或其他例外類型,並且將 except 比對到 的例外作為來源,可以使用 raise from 25
  25. 25. 26
  26. 26. • 可以透過例外實例的 __cause__來取得 raise from 時的來源例外 • 如果一個例外在 except 中被引發,就算 沒有使用 raise from,原本比對到的例 外,也會自動被設定給被引發例外的 __context__ 27
  27. 27. 28
  28. 28. Python 例外風格 • 在Python 中,例外並不一定是錯誤 • SystemExit、GeneratorExit、 KeyboardInterrupt、 StopIteration • 更像是一種事件,代表著流程因為某個原 因無法繼續而必須中斷 29
  29. 29. • 主動引發例外,是對呼叫者善盡告知責任 • 在 Python 中,就算例外是個錯誤,只要程 式碼能明確表達出意圖的情況下,也常會 當成是流程的一部份 30
  30. 30. 認識堆疊追蹤 • 想得知例外發生的根源,以及多重呼叫下 例外的傳播過程,可利用 traceback 模組 31
  31. 31. 32
  32. 32. • print_exc() 是 print_exception(*sys.exc_info(), limit, file, chain) 的便捷方法 33
  33. 33. • traceback 物件代表了呼叫堆疊中每一個 層次的追蹤 34
  34. 34. 35
  35. 35. • 對一個未被比對到的例外,python 直譯 器最後會呼叫 sys.excepthook() 並傳 入三個引數 – 例外類別、實例與 traceback 物件 • 如果想要自訂 sys.excepthook() 被呼 叫時的行為,也可以自行指定一個可接受 三個引數的函式給 sys.excepthook 36
  36. 36. 37
  37. 37. • Exception 有個子類別 Warning 38
  38. 38. • 警告訊息通常作為一種提示,用來告知程 式有一些潛在性的問題 • 例如使用了被棄用(Deprecated)的功能、 以不適當的方式存取資源等 • Warning 雖然是一種例外,不過基本上不 會直接透過 raise 引發 • 透過 warnings 模組的 warn() 函式來提 出警告 39
  39. 39. • 預設的情況下,執行 warnings.warn() 函式不會產生任何結果 • 執行 python 直譯器時,透過 -W 引數指定 警告控制 40
  40. 40. • -W 接受的格式是 action:message:category:module:lineno 41
  41. 41. 42
  42. 42. • 如果不想在執行 python 直譯器時加上- W 指定, 也可以設定 PYTHONWARNINGS 環境變數 • 若已經設定PYTHONWARNINGS 環境變數, 執行時又自行加上-W 指定,則使用-W 的 指定 43
  43. 43. 44
  44. 44. • 也可以在程式中設定警告訊息控制, 例如 簡單地使用 warnings.simplefilter() 方法: 45
  45. 45. try、except、else • else 與 try、except 搭配,讓 try 中的 程式碼,盡量與可能引發例外的來源相關 46
  46. 46. • Python 官方文件〈Errors and Exceptions〉 也有個範例: 47
  47. 47. • 這會比撰寫以下的程式來得好: 48
  48. 48. try、finally 49
  49. 49. • 若檔案開啟失敗,就不會建立 f 變數,最 後執行 finally 的 f.close() 時, 就會引發NameError 50
  50. 50. • 如果程式撰寫的流程中先 return 了,而 且也有寫 finally 區塊 • finally 區塊會先執行完後,再將值傳回 51
  51. 51. 使用 with as • 自定義一個 with_file() 函式: 52
  52. 52. 53
  53. 53. • Python 提供 with as 語法解決這類需求 54
  54. 54. • with 之後銜接的資源實例,可以透過 as 來指定給一個變數,之後就可以在區塊中 進行資源的處理 • 當離開 with as 區塊之後,就會自動做清 除資源的動作 55
  55. 55. • 只要物件支援情境管理協定,就可以使用 with as 語句 • 支援情境管理協定的物件,必須實作 __enter__() 與 __exit__() 兩個方法 56
  56. 56. 57
  57. 57. 58
  58. 58. • 可以使用 contextlib 模組的 @contextmanager 來實作 59
  59. 59. • with as 語法是用來表示,其區塊是處於 某個特殊的情境之中 • 處於自動關閉檔案的情境是其中一種情況 • 使用 @contextmanager 實作函式時, yield 的前後建立了with 區塊的情境 60
  60. 60. 61
  61. 61. • contextlib 模組就提供有 suppress() 函式: 62
  62. 62. • 如果某個物件有實作了 close() 方法,但 沒有實作情境管理器協定: 63
  63. 63. • contextlib 模組就提供有 closing() 函式: 64

使用 try、except 處理例外 認識例外繼承架構 認識 raise 使用時機 運用 finally 清除資源 使用 with as 管理資源

Views

Total views

275

On Slideshare

0

From embeds

0

Number of embeds

0

Actions

Downloads

60

Shares

0

Comments

0

Likes

0

×