# 案例剖析
## 1\. 捕獲異常 try...except...
看如下示例:
~~~
try:
print('-----test--1---')
open('123.txt','r')
print('-----test--2---')
except IOError:
pass
~~~
運行結果:
:-: 
說明:
* 此程序看不到任何錯誤,因為用except 捕獲到了IOError異常,并添加了處理的方法
* pass 表示實現了相應的實現,但什么也不做;如果把pass改為print語句,那么就會輸出其他信息
小總結:
* 
* 把可能出現問題的代碼,放在try中
* 把處理異常的代碼,放在except中
## 2\. except捕獲多個異常
看如下示例:
~~~
try:
print(num)
except IOError:
print('產生錯誤了')
~~~
運行結果如下:
:-: 
想一想:
> 上例程序,已經使用except來捕獲異常了,為什么還會看到錯誤的信息提示?
答:
> except捕獲的錯誤類型是IOError,而此時程序產生的異常為 NameError ,所以except沒有生效
修改后的代碼為:
~~~
try:
print(num)
except NameError:
print('產生錯誤了')
~~~
運行結果如下:
:-: 
#### 實際開發中,捕獲多個異常的方式,如下:
~~~
#coding=utf-8
try:
print('-----test--1---')
open('123.txt','r') # 如果123.txt文件不存在,那么會產生 IOError 異常
print('-----test--2---')
print(num)# 如果num變量沒有定義,那么會產生 NameError 異常
except (IOError,NameError):
#如果想通過一次except捕獲到多個異常可以用一個元組的方式
~~~
### 注意:
* 當捕獲多個異常時,可以把要捕獲的異常的名字,放到except 后,并使用元組的方式僅進行存儲
## 3\. 獲取異常的信息描述
:-: 
:-: 
## 4\. 捕獲所有異常
:-: 
:-: 
## 5\. else
咱們應該對`else`并不陌生,在if中,它的作用是當條件不滿足時執行的實行;同樣在try...except...中也是如此,即如果沒有捕獲到異常,那么就執行else中的事情
~~~
try:
num = 100
print num
except NameError as errorMsg:
print('產生錯誤了:%s'%errorMsg)
else:
print('沒有捕獲到異常,真高興')
~~~
運行結果如下:
:-: 
## 6\. try...finally...
try...finally...語句用來表達這樣的情況:
> 在程序中,如果一個段代碼必須要執行,即無論異常是否產生都要執行,那么此時就需要使用finally。 比如文件關閉,釋放鎖,把數據庫連接返還給連接池等
demo:
~~~
import time
try:
f = open('test.txt')
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except:
#如果在讀取文件的過程中,產生了異常,那么就會捕獲到
#比如 按下了 ctrl+c
pass
finally:
f.close()
print('關閉文件')
except:
print("沒有這個文件")
~~~
說明:
> test.txt文件中每一行數據打印,但是我有意在每打印一行之前用time.sleep方法暫停2秒鐘。這樣做的原因是讓程序運行得慢一些。在程序運行的時候,按Ctrl+c中斷(取消)程序。
>
> 我們可以觀察到KeyboardInterrupt異常被觸發,程序退出。但是在程序退出之前,finally從句仍然被執行,把文件關閉。
- 計算機組成原理和Python基礎知識
- 計算機組成原理
- 編程語言和Python
- 開發第一個Python程序
- 注釋
- 變量以及類型
- 標識符和關鍵字
- 輸出
- 輸入
- 運算符
- 數據類型轉換
- 判斷語句和循環語句
- 判斷語句介紹
- if語句
- 比較、關系運算符
- if...else...語句格式
- if...elif...else語句格式
- if語句的嵌套
- if應用:猜拳游戲
- 循環語句介紹
- while循環
- while循環應用
- while循環的嵌套以及應用
- for循環
- break和continue
- 字符串、列表、元組、字典
- 字符串介紹
- 字符串輸出
- 字符串輸入
- 下標和切片
- 字符串常見操作
- 列表介紹
- 列表的循環遍歷
- 列表的常見操作
- 列表的嵌套
- 元組
- 字典介紹
- 字典的常見操作1
- 字典的常見操作2
- 字典的遍歷
- 集合(擴展)
- 公共方法
- 4.函數(一)
- 4.1.函數介紹
- 4.2.函數定義和調用
- 4.3.函數的文檔說明
- 4.4.函數參數(一)
- 4.5.函數返回值(一)
- 4.6.函數的嵌套調用
- 4.7.函數應用:打印圖形和數學計算
- 5.函數(二)
- 5.1.局部變量
- 5.2.全局變量
- 5.3.多函數程序的基本使用流程
- 5.4.函數返回值(二)
- 5.5.函數參數(二)
- 5.6.拆包、交換變量的值
- 5.7.引用(一)
- 5.8.可變、不可變類型
- 5.9.引用(二)
- 5.10.函數使用注意事項
- 6.強化練習
- 6.1.函數應用:學生管理系統
- 6.2.遞歸函數
- 6.3. 匿名函數
- 6.4.列表推導式
- 6.5.set、list、tuple
- 6.6.高階函數: map reduce filter
- 7.文件操作,綜合應用
- 7.1.文件操作介紹
- 7.2.文件的讀寫
- 7.3.應用1:制作文件的備份
- 7.4.文件的相關操作
- 7.5.應用:批量修改文件名
- 7.6.綜合應用:學生管理系統(文件版)
- 8.面向對象(上)
- 8.1.認識面向對象編程
- 8.2.類和對象
- 8.3.定義類
- 8.4.創建對象
- 8.5.添加和獲取對象的屬性
- 8.6.在方法內通過self獲取對象屬性
- 8.7.魔法方法 - init()
- 8.8.魔法方法 - 有參數的__init__()方法
- 8.9.魔法方法 - str()方法
- 8.10.魔法方法 - del()方法
- 8.11.實操案例 - 烤土豆
- 9.面向對象(中)
- 9.1.實操案例 - 放家具
- 9.2.繼承的概念
- 9.3.單繼承
- 9.4.多繼承
- 9.5.子類重寫父類的同名屬性和方法
- 9.6.子類調用父類同名屬性和方法
- 9.7.多層繼承
- 9.8.通過super()來調用父類的方法
- 10.面向對象(下)
- 10.1.私有屬性和私有方法
- 10.2.修改私有屬性的值
- 10.3.多態
- 10.4.類屬性和實例屬性
- 10.5.靜態方法和類方法
- 11.異常處理與模塊初識
- 11.1.異常
- 11.2.捕獲異常
- 11.3.異常的傳遞
- 11.4.拋出自定義的異常
- 11.5.獲取異常完整信息的正確姿勢
- 11.6.認識模塊
- 11.7.開發模塊
- 11.8.模塊中的__all__(未完成)
- 11.9.python中的包(未完成)
- 12.課后加餐
- 12.1.基礎應用 - 進銷存管理系統(未完成)
- 12.2.基礎應用 - 員工信息管理系統(未完成)
- 12.1.編碼規范 - PEP8編碼規范(未完成)