[TOC]
## 一 什么是異常
異常就是程序運行時發生錯誤的信號(在程序出現錯誤時,則會產生一個異常,若程序沒有處理它,則會拋出該異常,程序的運行也隨之終止),在python中,**錯誤分成兩種**
1. 語法錯誤(這種錯誤,根本過不了python解釋器的語法檢測,必須在程序執行前就改正)
~~~
#語法錯誤示范一
if
#語法錯誤示范二
def test:
pass
#語法錯誤示范三
class Foo
pass
#語法錯誤示范四
print(haha)
~~~
2. 邏輯錯誤
~~~
#TypeError:int類型不可迭代
for i in 3:
pass
#ValueError
num=input(">>: ") #輸入hello
int(num)
#NameError
aaa
#IndexError
l=['egon','aa']
l[3]
#KeyError
dic={'name':'egon'}
dic['age']
#AttributeError
class Foo:pass
Foo.x
#ZeroDivisionError:無法完成計算
res1=1/0
res2=1+'str'
~~~
## 二 常見異常解釋
在python中不同的異常可以用不同的類型(python中統一了類與類型,類型即類)去標識,一個異常標識一種錯誤
| 異常代號 | 異常解釋 |
| --- | --- |
| AttributeError | 試圖訪問一個對象沒有的屬性形,比如foo.x,但是foo沒有屬性x|
| IOError | 輸入/輸出異常;基本上是無法打開文件|
| ImportError | 無法引入模塊或包;基本上是路徑問題或名稱錯誤|
| IndentationError | 語法錯誤(的子類) ;代碼沒有正確對齊|
| IndexError | 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]|
| KeyError | 試圖訪問字典里不存在的鍵|
| KeyboardInterrupt | Ctrl+C被按下|
| NameError | 使用一個還未被賦予對象的變量|
| SyntaxError | Python代碼非法,代碼不能編譯(語法錯誤)|
| TypeError | 傳入對象類型與要求的不符合|
| UnboundLocalError | 試圖訪問一個還未被設置的局部變量,基本上是由于另有一個同名的全局變量,導致你以為正在訪問它|
| ValueError | 傳入一個調用者不期望的值,即使值的類型是正確的|
## 三 異常處理
為了保證程序的健壯性與容錯性,即在遇到錯誤時程序不會崩潰,我們需要對異常進行處理,
### 可預知的錯誤
**如果錯誤發生的條件是可預知的,我們需要用if進行處理:在錯誤發生之前進行預防**
~~~
AGE=10
while True:
age=input('>>: ').strip()
if age.isdigit(): #只有在age為字符串形式的整數時,下列代碼才不會出錯,該條件是可預知的
age=int(age)
if age == AGE:
print('you got it')
break
~~~
### 不可預知的錯誤
**如果錯誤發生的條件是不可預知的,則需要用到try...except:在錯誤發生之后進行處理**
~~~
#基本語法為
try:
被檢測的代碼塊
except 異常類型:
try中一旦檢測到異常,就執行這個位置的邏輯
#舉例
try:
f=open('a.txt')
g=(line.strip() for line in f)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
except StopIteration:
f.close()
~~~
## 四 try..except...詳細用法
### **指定異常類型**
異常類只能用來處理指定的異常情況,如果非指定異常則無法處理
1. 單分支
~~~
s1 = 'hello'
try:
int(s1)
except IndexError as e: # 未捕獲到異常,程序直接報錯
print e
~~~
2. 多分支
~~~
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
~~~
### **萬能異常Exception**
可以使用Exceptios來代表所有的異常情況,即遇到任何異常都執行后面的程序
1. 單分支
~~~
s1 = 'hello'
try:
int(s1)
except Exception as e:
print(e)
~~~
2. 多分支
~~~
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except Exception as e:
print(e)
~~~
### **else和finally語句**
try異常處理語句后面,還可以esle和finally語句,作用分別如下
* else:
try內代碼塊沒有異常則執行,即異常沒有被觸發是執行
* finally:
無論異常是否被觸發,都會執行模塊,通常是進行清理工作
用法舉例:
~~~
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
else:
print('try內代碼塊沒有異常則執行我')
finally:
print('無論異常與否,都會執行該模塊,通常是進行清理工作')
~~~
### **主動觸發異常**
程序判斷過程中,某些條件下需要手動拋出異常,可以通過raise語句來主動觸發異常
~~~
name='noahs'
if name != 'noah':
raise ValueError('值錯誤')
~~~
### 自定義異常
可以通過類的方式自定義異常類型
~~~
class EgonException(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg
try:
raise EgonException('類型錯誤')
except EgonException as e:
print(e)
~~~
### 斷言:assert 條件
assert就相當于一個條件判斷,判斷條件是否滿足,不滿足的的話就拋出異常,如:
~~~
info={}
info['name']='noah'
assert 'name' in info #不會拋出異常
assert 'age' in info #會拋出異常
~~~
## 五 總結try..except
1:把錯誤處理和真正的工作分開來
2:代碼更易組織,更清晰,復雜的工作任務更容易實現;
3:毫無疑問,更安全了,不至于由于一些小的疏忽而使程序意外崩潰了;
- 基礎部分
- 基礎知識
- 變量
- 數據類型
- 數字與布爾詳解
- 列表詳解list
- 字符串詳解str
- 元組詳解tup
- 字典詳解dict
- 集合詳解set
- 運算符
- 流程控制與循環
- 字符編碼
- 編的小程序
- 三級菜單
- 斐波那契數列
- 漢諾塔
- 文件操作
- 函數相關
- 函數基礎知識
- 函數進階知識
- lambda與map-filter-reduce
- 裝飾器知識
- 生成器和迭代器
- 琢磨的小技巧
- 通過operator函數將字符串轉換回運算符
- 目錄規范
- 異常處理
- 常用模塊
- 模塊和包相關概念
- 絕對導入&相對導入
- pip使用第三方源
- time&datetime模塊
- random隨機數模塊
- os 系統交互模塊
- sys系統模塊
- shutil復制&打包模塊
- json&pickle&shelve模塊
- xml序列化模塊
- configparser配置模塊
- hashlib哈希模塊
- subprocess命令模塊
- 日志logging模塊基礎
- 日志logging模塊進階
- 日志重復輸出問題
- re正則表達式模塊
- struct字節處理模塊
- abc抽象類與多態模塊
- requests與urllib網絡訪問模塊
- 參數控制模塊1-optparse-過時
- 參數控制模塊2-argparse
- pymysql數據庫模塊
- requests網絡請求模塊
- 面向對象
- 面向對象相關概念
- 類與對象基礎操作
- 繼承-派生和組合
- 抽象類與接口
- 多態與鴨子類型
- 封裝-隱藏與擴展性
- 綁定方法與非綁定方法
- 反射-字符串映射屬性
- 類相關內置方法
- 元類自定義及單例模式
- 面向對象的軟件開發
- 網絡-并發編程
- 網絡編程SOCKET
- socket簡介和入門
- socket代碼實例
- 粘包及粘包解決辦法
- 基于UDP協議的socket
- 文件傳輸程序實戰
- socketserver并發模塊
- 多進程multiprocessing模塊
- 進程理論知識
- 多進程與守護進程
- 鎖-信號量-事件
- 隊列與生產消費模型
- 進程池Pool
- 多線程threading模塊
- 進程理論和GIL鎖
- 死鎖與遞歸鎖
- 多線程與守護線程
- 定時器-條件-隊列
- 線程池與進程池(新方法)
- 協程與IO模型
- 協程理論知識
- gevent與greenlet模塊
- 5種網絡IO模型
- 非阻塞與多路復用IO實現
- 帶著目標學python
- Pycharm基本使用
- 爬蟲
- 案例-爬mzitu美女
- 案例-爬小說
- beautifulsoup解析模塊
- etree中的xpath解析模塊
- 反爬對抗-普通驗證碼
- 反爬對抗-session登錄
- 反爬對抗-代理池
- 爬蟲技巧-線程池
- 爬蟲對抗-圖片懶加載
- selenium瀏覽器模擬