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

Más contenido relacionado

La actualidad más candente

流程語法與函式
流程語法與函式流程語法與函式
流程語法與函式Justin Lin
 
11, exceptions
11, exceptions11, exceptions
11, exceptionsted-xu
 
CH08:例外處理
CH08:例外處理CH08:例外處理
CH08:例外處理Justin Lin
 
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJustin Lin
 
CH11:執行緒與並行API
CH11:執行緒與並行APICH11:執行緒與並行API
CH11:執行緒與並行APIJustin Lin
 
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Justin Lin
 
從模組到類別
從模組到類別從模組到類別
從模組到類別Justin Lin
 
9. meta-programming
9. meta-programming9. meta-programming
9. meta-programmingJustin Lin
 
從模組到類別
從模組到類別從模組到類別
從模組到類別Justin Lin
 
型態與運算子
型態與運算子型態與運算子
型態與運算子Justin Lin
 
資料永續與交換
資料永續與交換資料永續與交換
資料永續與交換Justin Lin
 
12, string
12, string12, string
12, stringted-xu
 
Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件Justin Lin
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJustin Lin
 
從 REPL 到 IDE
從 REPL 到 IDE從 REPL 到 IDE
從 REPL 到 IDEJustin Lin
 
5. 建構式、原型與類別
5. 建構式、原型與類別5. 建構式、原型與類別
5. 建構式、原型與類別Justin Lin
 
如何用JDK8實作一個小型的關聯式資料庫系統
如何用JDK8實作一個小型的關聯式資料庫系統如何用JDK8實作一個小型的關聯式資料庫系統
如何用JDK8實作一個小型的關聯式資料庫系統なおき きしだ
 
型態與運算子
型態與運算子型態與運算子
型態與運算子Justin Lin
 
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJava SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJustin Lin
 

La actualidad más candente (20)

流程語法與函式
流程語法與函式流程語法與函式
流程語法與函式
 
11, exceptions
11, exceptions11, exceptions
11, exceptions
 
例外處理
例外處理例外處理
例外處理
 
CH08:例外處理
CH08:例外處理CH08:例外處理
CH08:例外處理
 
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
 
CH11:執行緒與並行API
CH11:執行緒與並行APICH11:執行緒與並行API
CH11:執行緒與並行API
 
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
 
從模組到類別
從模組到類別從模組到類別
從模組到類別
 
9. meta-programming
9. meta-programming9. meta-programming
9. meta-programming
 
從模組到類別
從模組到類別從模組到類別
從模組到類別
 
型態與運算子
型態與運算子型態與運算子
型態與運算子
 
資料永續與交換
資料永續與交換資料永續與交換
資料永續與交換
 
12, string
12, string12, string
12, string
 
Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
 
從 REPL 到 IDE
從 REPL 到 IDE從 REPL 到 IDE
從 REPL 到 IDE
 
5. 建構式、原型與類別
5. 建構式、原型與類別5. 建構式、原型與類別
5. 建構式、原型與類別
 
如何用JDK8實作一個小型的關聯式資料庫系統
如何用JDK8實作一個小型的關聯式資料庫系統如何用JDK8實作一個小型的關聯式資料庫系統
如何用JDK8實作一個小型的關聯式資料庫系統
 
型態與運算子
型態與運算子型態與運算子
型態與運算子
 
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJava SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
 

Destacado

open() 與 io 模組
open() 與 io 模組open() 與 io 模組
open() 與 io 模組Justin Lin
 
網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知Justin Lin
 
Python 起步走
Python 起步走Python 起步走
Python 起步走Justin Lin
 
OpenSCAD Workshop
OpenSCAD WorkshopOpenSCAD Workshop
OpenSCAD WorkshopJustin Lin
 
Python 3 Programming Language
Python 3 Programming LanguagePython 3 Programming Language
Python 3 Programming LanguageTahani Al-Manie
 
類別的繼承
類別的繼承類別的繼承
類別的繼承Justin Lin
 
除錯、測試與效能
除錯、測試與效能除錯、測試與效能
除錯、測試與效能Justin Lin
 
Python Programming Essentials - M44 - Overview of Web Development
Python Programming Essentials - M44 - Overview of Web DevelopmentPython Programming Essentials - M44 - Overview of Web Development
Python Programming Essentials - M44 - Overview of Web DevelopmentP3 InfoTech Solutions Pvt. Ltd.
 
《Python 3.5 技術手冊》第二章草稿
《Python 3.5 技術手冊》第二章草稿《Python 3.5 技術手冊》第二章草稿
《Python 3.5 技術手冊》第二章草稿Justin Lin
 
PyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 TutorialPyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 TutorialJustin Lin
 
3D 之邏輯與美感交會 - OpenSCAD
3D 之邏輯與美感交會 - OpenSCAD3D 之邏輯與美感交會 - OpenSCAD
3D 之邏輯與美感交會 - OpenSCADJustin Lin
 
常用內建模組
常用內建模組常用內建模組
常用內建模組Justin Lin
 
初學R語言的60分鐘
初學R語言的60分鐘初學R語言的60分鐘
初學R語言的60分鐘Chen-Pan Liao
 

Destacado (17)

資料結構
資料結構資料結構
資料結構
 
open() 與 io 模組
open() 與 io 模組open() 與 io 模組
open() 與 io 模組
 
網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知
 
Python 起步走
Python 起步走Python 起步走
Python 起步走
 
OpenSCAD Workshop
OpenSCAD WorkshopOpenSCAD Workshop
OpenSCAD Workshop
 
Python 3 Programming Language
Python 3 Programming LanguagePython 3 Programming Language
Python 3 Programming Language
 
類別的繼承
類別的繼承類別的繼承
類別的繼承
 
除錯、測試與效能
除錯、測試與效能除錯、測試與效能
除錯、測試與效能
 
Python Programming Essentials - M44 - Overview of Web Development
Python Programming Essentials - M44 - Overview of Web DevelopmentPython Programming Essentials - M44 - Overview of Web Development
Python Programming Essentials - M44 - Overview of Web Development
 
《Python 3.5 技術手冊》第二章草稿
《Python 3.5 技術手冊》第二章草稿《Python 3.5 技術手冊》第二章草稿
《Python 3.5 技術手冊》第二章草稿
 
Python
PythonPython
Python
 
Python Programming Essentials - M22 - File Operations
Python Programming Essentials - M22 - File OperationsPython Programming Essentials - M22 - File Operations
Python Programming Essentials - M22 - File Operations
 
PyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 TutorialPyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 Tutorial
 
3D 之邏輯與美感交會 - OpenSCAD
3D 之邏輯與美感交會 - OpenSCAD3D 之邏輯與美感交會 - OpenSCAD
3D 之邏輯與美感交會 - OpenSCAD
 
常用內建模組
常用內建模組常用內建模組
常用內建模組
 
進階主題
進階主題進階主題
進階主題
 
初學R語言的60分鐘
初學R語言的60分鐘初學R語言的60分鐘
初學R語言的60分鐘
 

Similar a 例外處理

Java_04:例外異常處理機制
Java_04:例外異常處理機制Java_04:例外異常處理機制
Java_04:例外異常處理機制Brad Chao
 
TensorFlow 深度學習快速上手班--深度學習
 TensorFlow 深度學習快速上手班--深度學習 TensorFlow 深度學習快速上手班--深度學習
TensorFlow 深度學習快速上手班--深度學習Mark Chang
 
Refactoring with Patterns in PHP
Refactoring with Patterns in PHPRefactoring with Patterns in PHP
Refactoring with Patterns in PHPJace Ju
 
例外處理與單元測試
例外處理與單元測試例外處理與單元測試
例外處理與單元測試國昭 張
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)Max Lai
 
2, object oriented programming
2, object oriented programming2, object oriented programming
2, object oriented programmingted-xu
 
Clean code ch7_exception
Clean code ch7_exceptionClean code ch7_exception
Clean code ch7_exceptionssuser27764c
 

Similar a 例外處理 (9)

Java_04:例外異常處理機制
Java_04:例外異常處理機制Java_04:例外異常處理機制
Java_04:例外異常處理機制
 
TensorFlow 深度學習快速上手班--深度學習
 TensorFlow 深度學習快速上手班--深度學習 TensorFlow 深度學習快速上手班--深度學習
TensorFlow 深度學習快速上手班--深度學習
 
Refactoring with Patterns in PHP
Refactoring with Patterns in PHPRefactoring with Patterns in PHP
Refactoring with Patterns in PHP
 
例外處理與單元測試
例外處理與單元測試例外處理與單元測試
例外處理與單元測試
 
SCJP ch14
SCJP ch14SCJP ch14
SCJP ch14
 
Tip for Editors
Tip for EditorsTip for Editors
Tip for Editors
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)
 
2, object oriented programming
2, object oriented programming2, object oriented programming
2, object oriented programming
 
Clean code ch7_exception
Clean code ch7_exceptionClean code ch7_exception
Clean code ch7_exception
 

Más de Justin Lin

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring BootJustin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走Justin Lin
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMailJustin 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 使用 JSTLJustin Lin
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSPJustin 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 撰寫與設定 ServletJustin 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
 

Más de Justin Lin (20)

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

例外處理