狠狠撸

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

More Related Content

What's hot (20)

并行与平行
并行与平行并行与平行
并行与平行
Justin Lin
?
型态与运算子
型态与运算子型态与运算子
型态与运算子
Justin Lin
?
CH08:例外处理
CH08:例外处理CH08:例外处理
CH08:例外处理
Justin Lin
?
从模组到类别
从模组到类别从模组到类别
从模组到类别
Justin Lin
?
5. 建構式、原型與類別
5. 建構式、原型與類別5. 建構式、原型與類別
5. 建構式、原型與類別
Justin Lin
?
從 REPL 到 IDE
從 REPL 到 IDE從 REPL 到 IDE
從 REPL 到 IDE
Justin Lin
?
从模组到类别
从模组到类别从模组到类别
从模组到类别
Justin Lin
?
Java SE 7 技術手冊投影片第 08 章 - 例外处理
Java SE 7 技術手冊投影片第 08 章 - 例外处理Java SE 7 技術手冊投影片第 08 章 - 例外处理
Java SE 7 技術手冊投影片第 08 章 - 例外处理
Justin Lin
?
颁贬11:执行绪与并行础笔滨
颁贬11:执行绪与并行础笔滨颁贬11:执行绪与并行础笔滨
颁贬11:执行绪与并行础笔滨
Justin Lin
?
资料永续与交换
资料永续与交换资料永续与交换
资料永续与交换
Justin Lin
?
4. 使用物件
4. 使用物件4. 使用物件
4. 使用物件
Justin Lin
?
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
?
12, string
12, string12, string
12, string
ted-xu
?
进阶主题
进阶主题进阶主题
进阶主题
Justin Lin
?
Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
?
open() 與 io 模組
open() 與 io 模組open() 與 io 模組
open() 與 io 模組
Justin Lin
?
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
Justin Lin
?
open() 與 io 模組
open() 與 io 模組open() 與 io 模組
open() 與 io 模組
Justin Lin
?
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
?
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
ted-xu
?
型态与运算子
型态与运算子型态与运算子
型态与运算子
Justin Lin
?
CH08:例外处理
CH08:例外处理CH08:例外处理
CH08:例外处理
Justin Lin
?
从模组到类别
从模组到类别从模组到类别
从模组到类别
Justin Lin
?
5. 建構式、原型與類別
5. 建構式、原型與類別5. 建構式、原型與類別
5. 建構式、原型與類別
Justin Lin
?
从模组到类别
从模组到类别从模组到类别
从模组到类别
Justin Lin
?
Java SE 7 技術手冊投影片第 08 章 - 例外处理
Java SE 7 技術手冊投影片第 08 章 - 例外处理Java SE 7 技術手冊投影片第 08 章 - 例外处理
Java SE 7 技術手冊投影片第 08 章 - 例外处理
Justin Lin
?
颁贬11:执行绪与并行础笔滨
颁贬11:执行绪与并行础笔滨颁贬11:执行绪与并行础笔滨
颁贬11:执行绪与并行础笔滨
Justin Lin
?
资料永续与交换
资料永续与交换资料永续与交换
资料永续与交换
Justin Lin
?
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
?
12, string
12, string12, string
12, string
ted-xu
?
Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
?
open() 與 io 模組
open() 與 io 模組open() 與 io 模組
open() 與 io 模組
Justin Lin
?
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
Justin Lin
?
open() 與 io 模組
open() 與 io 模組open() 與 io 模組
open() 與 io 模組
Justin Lin
?
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
?
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
ted-xu
?

More from Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
Justin Lin
?
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
Justin Lin
?
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
Justin Lin
?
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
Justin Lin
?
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
Justin Lin
?
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
Justin Lin
?
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
Justin Lin
?
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
Justin Lin
?
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
Justin Lin
?
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
?
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
Justin Lin
?
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
Justin Lin
?
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
Justin Lin
?
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
Justin Lin
?
14. 进阶主题
14. 进阶主题14. 进阶主题
14. 进阶主题
Justin Lin
?
13.并行、平行与非同步
13.并行、平行与非同步13.并行、平行与非同步
13.并行、平行与非同步
Justin Lin
?
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
Justin Lin
?
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
Justin Lin
?
10. 资料永续与交换
10. 资料永续与交换10. 资料永续与交换
10. 资料永续与交换
Justin Lin
?
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
Justin Lin
?
Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
Justin Lin
?
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
Justin Lin
?
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
Justin Lin
?
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
Justin Lin
?
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
Justin Lin
?
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
Justin Lin
?
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
Justin Lin
?
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
?
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
Justin Lin
?
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
Justin Lin
?
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
Justin Lin
?
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
Justin Lin
?
13.并行、平行与非同步
13.并行、平行与非同步13.并行、平行与非同步
13.并行、平行与非同步
Justin Lin
?
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
Justin Lin
?
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
Justin Lin
?
10. 资料永续与交换
10. 资料永续与交换10. 资料永续与交换
10. 资料永续与交换
Justin Lin
?

7. 例外处理