10.1什麼是異常python
10.1.1錯誤程序員
語法錯誤 :軟件結構上有誤,致使不能被解釋器或編譯器沒法編譯編程
邏輯錯誤:不完整或不合法的輸入所致安全
10.1.2異常函數
程序出現了錯誤而在正常控制流之外採起的行爲:1.引起異常發生的錯誤 2.檢測階段code
10.2 python中的異常對象
1 NameError字符串
2.ZeroDivisionErrorinput
3.SyntaxError編譯器
4.IndexError
5.KeyError
6.IOError
7.AttributeError
10.3 檢測和處理異常
try-except 一個try語句能夠對應一個或多個except語句
try-finally 一個try語句只能對應一個finally語句 或是一個try-except-finally複合語句 finally是不管異常是否發生都會執行的一段代碼
字符串化異常參數: ....except(ValueError,TypeError),diag:
else語句:在else範圍中的任何代碼運行前,try範圍中的全部代碼必須徹底成功 try: except: else:
10.4 上下文管理
10.4.1 with語句
僅能支持上下文管理協議
10.6 觸發異常
raise語句
10.7 斷言
斷言一句等價於布爾真的斷定:此外,發生異常也意味着表達式爲假
10.10爲何要用異常
面對錯誤,應用應該成功的停止,不至於災難性的影響其執行環境。python異常處理促使成熟和正確的編程
10.11到底爲何要異常
試想Python沒有程序級的異常處理:1.須要擔憂的是客戶端程序員在本身代碼中遺忘控制
2.函數必須重寫來爲 錯誤的情形來返回一個‘特殊’的值
10.12 異常和sys模塊
另外一種獲取異常信息的途徑是經過sys模塊中exc_info()函數。此功能提供了一個3元組(3-tuple)
的信息。sys.exc_info()
sys.exc_info()獲得的元組是:
exc_type:異常類
exc_value:異常類的實類
exc_traceback 跟蹤記錄對象
10.14練習
10-1 e
10-2 d
10-3 raise
10-4
try-except 一個try語句能夠對應一個或多個except語句
try-finally 一個try語句只能對應一個finally語句 或是一個try-except-finally複合語句 finally是不管異常是否發生都會執行的一段代碼
10-5
a. SyntaxError
b.IndexError
c.NameError
d.ZeroDivisionError
e.ValueError
10-6 改進的 open().
爲內建的 open() 函數建立一個封裝. 使得成功打開文件後, 返回文件句柄; 若打開失敗則返回給調用者 None , 而不是生成一個異常. 這樣你打開文件時就不須要額外的異常處理語句
def new_open(infile): try: fobj = open(infile,'r') except IOError: fobj = None return fobj if __name__=='__main__': print new_open('test')
10.7 異常
1.若A異常,則(a)和(b)中的B都不會執行
2.若A正常,(a)(b)都會執行B,但若B異常,b中會對異常作出處理,a中則會把異常拋給上層調用者
10.8改進的 raw_input() . 本章的開頭, 咱們給出了一個"安全"的 float() 函數,它創建在內建函數 float() 上, 能夠檢測並處理 float() 可能會引起的兩種不一樣異常. 一樣,raw_input() 函數也可能會生成兩種異常, EOFError (文件末尾 EOF, 在 Unix 下是因爲按下了Ctrl+D 在 Dos 下是由於 Ctrl+Z) 或是 KeyboardInterrupt ( 取消輸入, 通常是因爲按下了Ctrl+C). 請建立一個封裝函數 safe_input() , 在發生異常時返回 None
def safe_input(prompt): try: retval = raw_input(prompt) return retval except(EOFError,KeyboardInterrupt): return None if __name__ == '__main__': safe_input("input some words")
10.9 改進的 math.sqrt(). math 模塊包含大量用於處理數值相關運算的函數和常量. 不幸的是, 它不能識別複數, 因此咱們建立了 cmath 模塊來支持複數相關運算. 請建立一個safe_sqrt() 函數, 它封裝 math.sqrt() 並能處理負值, 返回一個對應的複數.
import math def safe_sqrt(num): try: result = math.sqrt(num) except ValueError: import cmath result = cmath.sqrt(num) return result