Python运行环境与异常处理
Python的命令格式:
python?[option]?...?[-c?cmd?|?-m?mod?|?file?|?-]?[arg]?...| 選項(xiàng) | 描述 |
| -J | 啟動(dòng)將從Python3中刪除或更改某些功能的警告 |
| -B | 阻止在導(dǎo)入時(shí)創(chuàng)建.pyc或.pyo文件 |
| -E | 忽略環(huán)境變量 |
| -h | 打印所有可用命令行選項(xiàng)的列表 |
| -i | 在程序執(zhí)行后進(jìn)入交互模式 |
| -m module | 以腳本的形式運(yùn)行庫模塊module |
| -O | 優(yōu)化模式 |
| -OO | 優(yōu)化模式,在創(chuàng)建.pyo文件時(shí)刪除文檔字符串 |
| -Q arg | 指定Pyhthon2中除法運(yùn)算符的行為,值為-Qold (默認(rèn)), -Qwarn, -Qwarnall,? -Qnew之一 |
| -s | 阻止將用戶站點(diǎn)目錄追加到sys.path |
| -S | 阻止包含site初始模塊 |
| -t | 報(bào)告關(guān)于不一致的標(biāo)簽使用警告 |
| -tt | 由于不一致的標(biāo)簽使用而導(dǎo)致TabError異常 |
| -u | 未緩沖的二進(jìn)制stdout和stdin |
| -U | Unicode字面量,所有字符串字面量都以Unicode形式處理(僅在Python2中使用) |
| -v | 詳細(xì)模式,跟蹤導(dǎo)入語句 |
| -V | 打印版本信息 |
| -x | 跳過源程序的第一行 |
| -c cmd | 以字符串形式執(zhí)行cmd |
2、doctest代碼測(cè)試模塊
? Doctest模塊允許在文檔字符串內(nèi)嵌入注釋以顯示各種語句的期望行為,尤其是函數(shù)和方法的結(jié)構(gòu);此處的文檔字符串看起來如同一個(gè)交互式shell會(huì)話;可用于測(cè)試文檔是否與主程序保持同步,或基于文檔對(duì)程序本身做測(cè)試。
?自定義測(cè)試模塊test.py:
? 使用doctest模塊進(jìn)行測(cè)試:
In?[1]:?import?test In?[2]:?import?doctest In?[3]:?doctest.testmod(test)??????????????#測(cè)試test.py模塊 Out[3]:?TestResults(failed=0,?attempted=1) In?[4]:?doctest.testmod(test,verbose=True) Trying:add(12,23) Expecting:35 ok 1?items?had?no?tests:test 1?items?passed?all?tests:1?tests?in?test.add 1?tests?in?2?items. 1?passed?and?0?failed. Test?passed. Out[4]:?TestResults(failed=0,?attempted=1)? 也可以直接定義自測(cè)試模塊:
[root@mylinux?home]#?cat?test.py? #!/usr/bin/python3 def?add(num1,num2):'''>>>?add(12,23)35'''return?num1+num2 if?__name__?==?'__main__':import?doctestdoctest.testmod() [root@mylinux?home]#?python3?test.py?????#測(cè)試通過時(shí)不會(huì)顯示任何信息 [root@mylinux?home]#?python3?test.py?-v??#輸出詳細(xì)信息 Trying:add(12,23) Expecting:35 ok 1?items?had?no?tests:__main__ 1?items?passed?all?tests:1?tests?in?__main__.add 1?tests?in?2?items. 1?passed?and?0?failed. Test?passed.3、Python的異常處理
? 在一些編程語言中,錯(cuò)誤是通過特殊的函數(shù)返回值指出的,而Python使用異常,它是只有錯(cuò)誤發(fā)生時(shí)執(zhí)行的代碼。錯(cuò)誤通常有:語法錯(cuò)誤和邏輯錯(cuò)誤兩大類。
| ?語法錯(cuò)誤:軟件的結(jié)構(gòu)上有錯(cuò)誤而導(dǎo)致不能被解釋器解釋或不能被編譯器編譯。 ?邏輯錯(cuò)誤:由于不完整或不合法的輸入所致,也可能是邏輯無法生成、計(jì)算或者輸出結(jié)果需要的 過程無法執(zhí)行等。 |
? 在Python中異常是一個(gè)對(duì)象,表示錯(cuò)誤或意外,檢測(cè)到一個(gè)錯(cuò)誤時(shí),將觸發(fā)異常。Python可以通過異常傳導(dǎo)機(jī)制傳遞一個(gè)異常對(duì)象,發(fā)出一個(gè)異常情況出現(xiàn)的信號(hào);程序員也可以在代碼中手動(dòng)觸發(fā)異常。Python異常可以理解為:程序員出現(xiàn)了錯(cuò)誤而在正常控制流以外采取的行為。這種處理可以分為兩個(gè)階段。
? ? 第一階段:解釋器觸發(fā)異常,此時(shí)當(dāng)前程序流被打斷;
? ? 第二階段:異常處理,如忽略非致命性錯(cuò)誤、減輕錯(cuò)誤帶來的影響等。
? 這種處理方式的主要作用有:
| 錯(cuò)誤處理:默認(rèn)處理,停止程序,打印錯(cuò)誤信息;使用try語句處理異常并恢復(fù) 事件通知:用于發(fā)出有效狀態(tài)信息 特殊情況處理:無法調(diào)整代碼去處理的現(xiàn)場(chǎng) 終止行為:try/finally語句可確保執(zhí)行必須的結(jié)束處理機(jī)制 非常規(guī)控制流程:異常是一種高級(jí)跳轉(zhuǎn)(goto)機(jī)制 |
-
異常的檢測(cè)與處理
? 在Python中,異常通過try語句來檢測(cè),任何在try語句塊里的代碼都會(huì)被監(jiān)測(cè),檢查有無異常。在本文中使用的是Python3作為演示。
? try語句的主要有兩種形式:
| try-except:檢測(cè)和處理異常。可以有多個(gè)except,支持使用else子句處理沒有探測(cè)異常的執(zhí)行代碼 try-finally:僅檢測(cè)異常并做一些必要的清理工作。僅能有一個(gè)finally。 try語句的復(fù)合形式:try-except-finally。 |
try-except語句:
try:try_suite except?Exception?[as?reason]:except_suiteIn?[1]:?try:...:?????f1=open('/tmp/a.txt','r')...:?except?IOError?as?e:...:?????print('Could?nor?open?file',e)...:????? Could?nor?open?file?[Errno?2]?No?such?file?or?directory:?'/tmp/a.txt'try-except-else語句:
? except分句個(gè)數(shù)沒有限制,但else只能有一個(gè);沒有異常發(fā)生時(shí),else分句才會(huì)執(zhí)行;沒有符合的except分句時(shí),異常會(huì)向上傳遞到程序中的之前進(jìn)入的try中或者道程序的頂層。
try:try_suite except?Exception1?[as?reason]:suite_exception1 except?(Exception1,?Exception2?,Exception3?...)[,?reason]:suite... except:suite else:else_suitetry-finally語句:
? 無論異常是否發(fā)生,finally子句都會(huì)執(zhí)行;常用于定義必須進(jìn)行的清理工作,如關(guān)閉文件或斷開服務(wù)連接等;finally中的所有代碼執(zhí)行完后會(huì)繼續(xù)向上一層引發(fā)異常。
try:try_suite finally:finally_suitetry-except-else-finally語句:
try:try_suite except?Exception1:suite_exception1 except?(Exception1,?Exception2?,):suite23 ... else:else_suite finally:finally_suite| 分句形式 | 說明 |
| except: | 捕捉所有(其他)異常類型 |
| except name [as e]: | 只捕捉特定的異常 |
| except (name1,name2): | 捕捉所列出的異常 |
| else: | 如果沒有異常就運(yùn)行 |
| finally: | 總是運(yùn)行此代碼塊 |
4、自定義異常
?raise語句允許程序員強(qiáng)制拋出一個(gè)指定的異常。其語法格式為:
raise[someexception?[?,arg?[,?traceback]]]? someexception:異常的名字,僅能使用字符串、類或?qū)嵗?#xff1b;
? args:以元組的形式傳遞給異常的參數(shù);
? traceback:異常出發(fā)時(shí)新生成的一個(gè)用于異常-正常化的跟蹤記錄,多用于重新引發(fā)異常。
In?[9]:?try:...:?????raise?NameError('HiThere')?????#定義異常...:?except?NameError:...:?????print('An?except?flew?by!')...:?????raise??????????????????????????#觸發(fā)異常...:? An?except?flew?by! -------------------------------------------------------------------------- NameError????????????????????????????????Traceback?(most?recent?call?last) <ipython-input-9-9448df11d518>?in?<module>()1?try: ---->?2?????raise?NameError('HiThere')3?except?NameError:4?????print('An?except?flew?by!')5?????raise NameError:?HiThere? 大多數(shù)的標(biāo)準(zhǔn)異常都是由StandError派生的,其中有3個(gè)抽象的子類:
| ArithmeticError | 由于算術(shù)錯(cuò)誤引發(fā)的異常基類 OverflowError、ZeroDivisionError、FloatingPointError |
| LookupError | 容器在接收到一個(gè)無效鍵或索引時(shí)引發(fā)異常 IndexError、KeyError |
| EnvironmentError | 由于外部原因而導(dǎo)致的異常的基類 IOError、OSError、WindowsError |
自定義異常類:
? 自定義異常類通常分為兩大類:
| 自定義異常和多重繼承:從定義異常類和標(biāo)準(zhǔn)異常類進(jìn)行多重繼承,例如: ? class customAttributeError(CustomException,AttributeError): ? pass 標(biāo)準(zhǔn)庫中使用的其它異常:如ArithmeticError、EnvironmentError等 |
assert語句通常用于在程序中引用調(diào)試代碼,語法格式為:
assert??condition?[,?expression]? 如果condition條件滿足,則assert不做任何操作;如果條件不滿足,則assert作為參數(shù)實(shí)例化AssertionError并引發(fā)結(jié)果實(shí)例。
? 如果運(yùn)行python時(shí)使用了-O優(yōu)化選項(xiàng),assert將是一個(gè)空操作,編譯器不為assert語句生成代碼 。運(yùn)行python不使用-O選項(xiàng),則__debug__內(nèi)置變量為True,否則為False。
? assert語句相當(dāng)于下面代碼:
if??__debug__:if?not?condition?:raise??AssertionError,?<expression> In?[17]:?assert?len(['my?boy',12])>10????#條件len(['my?boy',12])>10不滿足依法默認(rèn)異常 -------------------------------------------------------------------------- AssertionError???????????????????????????Traceback?(most?recent?call?last) <ipython-input-17-cc0a09de885b>?in?<module>() ---->?1?assert?len(['my?boy',12])>10 AssertionError:? In?[18]:?assert?range(4)==[0,1,2,3]??????#條件range(4)==[0,1,2,3]不滿足依法默認(rèn)異常 -------------------------------------------------------------------------- AssertionError???????????????????????????Traceback?(most?recent?call?last) <ipython-input-18-8b7aafe34e9e>?in?<module>() ---->?1?assert?range(4)==[0,1,2,3] AssertionError:? In?[19]:?assert?1==1????????????????????????#條件滿足,無輸出 In?[20]:?assert?range(4)==[0,1,2,3],IOError?#條件不滿足,自定義異常為IOError -------------------------------------------------------------------------- AssertionError???????????????????????????Traceback?(most?recent?call?last) <ipython-input-20-49011133d0d8>?in?<module>() ---->?1?assert?range(4)==[0,1,2,3],IOErrorAssertionError:?<class?'OSError'>本文轉(zhuǎn)自 夢(mèng)想成大牛 51CTO博客,原文鏈接:http://blog.51cto.com/yinsuifeng/1922560,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的Python运行环境与异常处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSVDE批量导入域用户
- 下一篇: Python基础--环境配置、编码风格、