Python運行環境與異常處理

Python的命令格式:

python?[option]?...?[-c?cmd?|?-m?mod?|?file?|?-]?[arg]?...
選項描述
-J

啟動將從Python3中刪除或更改某些功能的警告

-B
阻止在導入時創建.pyc或.pyo文件
-E忽略環境變量
-h
打印所有可用命令行選項的列表
-i
在程序執行后進入交互模式
-m module以腳本的形式運行庫模塊module
-O
優化模式
-OO
優化模式,在創建.pyo文件時刪除文檔字符串
-Q arg

指定Pyhthon2中除法運算符的行為,值為-Qold (默認), -Qwarn, -Qwarnall,?

-Qnew之一

-s
阻止將用戶站點目錄追加到sys.path
-S
阻止包含site初始模塊
-t
報告關于不一致的標簽使用警告
-tt
由于不一致的標簽使用而導致TabError異常
-u
未緩沖的二進制stdout和stdin
-U
Unicode字面量,所有字符串字面量都以Unicode形式處理(僅在Python2中使用)
-v
詳細模式,跟蹤導入語句

-V

打印版本信息
-x
跳過源程序的第一行
-c cmd
以字符串形式執行cmd

2、doctest代碼測試模塊

? Doctest模塊允許在文檔字符串內嵌入注釋以顯示各種語句的期望行為,尤其是函數和方法的結構;此處的文檔字符串看起來如同一個交互式shell會話;可用于測試文檔是否與主程序保持同步,或基于文檔對程序本身做測試。

?自定義測試模塊test.py:

[root@mylinux?home]#?cat?test.py?
#!/usr/bin/python3
def?add(num1,num2):'''>>>?add(12,23)?????#??'>>>'之后需要有一空格35'''return?num1+num2

? 使用doctest模塊進行測試:

In?[1]:?import?test
In?[2]:?import?doctest
In?[3]:?doctest.testmod(test)??????????????#測試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)

? 也可以直接定義自測試模塊:

[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?????#測試通過時不會顯示任何信息
[root@mylinux?home]#?python3?test.py?-v??#輸出詳細信息
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的異常處理

? 在一些編程語言中,錯誤是通過特殊的函數返回值指出的,而Python使用異常,它是只有錯誤發生時執行的代碼。錯誤通常有:語法錯誤和邏輯錯誤兩大類。

?語法錯誤:軟件的結構上有錯誤而導致不能被解釋器解釋或不能被編譯器編譯。

?邏輯錯誤:由于不完整或不合法的輸入所致,也可能是邏輯無法生成、計算或者輸出結果需要的

過程無法執行等。

? 在Python中異常是一個對象,表示錯誤或意外,檢測到一個錯誤時,將觸發異常。Python可以通過異常傳導機制傳遞一個異常對象,發出一個異常情況出現的信號;程序員也可以在代碼中手動觸發異常。Python異常可以理解為:程序員出現了錯誤而在正常控制流以外采取的行為。這種處理可以分為兩個階段。

? ? 第一階段:解釋器觸發異常,此時當前程序流被打斷;

? ? 第二階段:異常處理,如忽略非致命性錯誤、減輕錯誤帶來的影響等。

? 這種處理方式的主要作用有:

錯誤處理:默認處理,停止程序,打印錯誤信息;使用try語句處理異常并恢復

事件通知:用于發出有效狀態信息

特殊情況處理:無法調整代碼去處理的現場

終止行為:try/finally語句可確保執行必須的結束處理機制

非常規控制流程:異常是一種高級跳轉(goto)機制

  • 異常的檢測與處理

? 在Python中,異常通過try語句來檢測,任何在try語句塊里的代碼都會被監測,檢查有無異常。在本文中使用的是Python3作為演示。

? try語句的主要有兩種形式:

try-except:檢測和處理異常。可以有多個except,支持使用else子句處理沒有探測異常的執行代碼

try-finally:僅檢測異常并做一些必要的清理工作。僅能有一個finally。

try語句的復合形式: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分句個數沒有限制,但else只能有一個;沒有異常發生時,else分句才會執行;沒有符合的except分句時,異常會向上傳遞到程序中的之前進入的try中或者道程序的頂層。

try:try_suite
except?Exception1?[as?reason]:suite_exception1
except?(Exception1,?Exception2?,Exception3?...)[,?reason]:suite...
except:suite
else:else_suite

try-finally語句:

? 無論異常是否發生,finally子句都會執行;常用于定義必須進行的清理工作,如關閉文件或斷開服務連接等;finally中的所有代碼執行完后會繼續向上一層引發異常。

try:try_suite
finally:finally_suite

try-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:

如果沒有異常就運行
finally:
總是運行此代碼塊

4、自定義異常

?raise語句允許程序員強制拋出一個指定的異常。其語法格式為:

raise[someexception?[?,arg?[,?traceback]]]

? someexception:異常的名字,僅能使用字符串、類或實例;

? args:以元組的形式傳遞給異常的參數;

? traceback:異常出發時新生成的一個用于異常-正常化的跟蹤記錄,多用于重新引發異常。

In?[9]:?try:...:?????raise?NameError('HiThere')?????#定義異常...:?except?NameError:...:?????print('An?except?flew?by!')...:?????raise??????????????????????????#觸發異常...:?
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

? 大多數的標準異常都是由StandError派生的,其中有3個抽象的子類:

ArithmeticError

由于算術錯誤引發的異常基類

OverflowErrorZeroDivisionErrorFloatingPointError

LookupError

容器在接收到一個無效鍵或索引時引發異常

IndexErrorKeyError

EnvironmentError

由于外部原因而導致的異常的基類

IOErrorOSErrorWindowsError

自定義異常類:

? 自定義異常類通常分為兩大類:

自定義異常和多重繼承:從定義異常類和標準異常類進行多重繼承,例如:

? class customAttributeError(CustomException,AttributeError):

? pass

標準庫中使用的其它異常:如ArithmeticError、EnvironmentError等

assert語句通常用于在程序中引用調試代碼,語法格式為:

assert??condition?[,?expression]

? 如果condition條件滿足,則assert不做任何操作;如果條件不滿足,則assert作為參數實例化AssertionError并引發結果實例。

? 如果運行python時使用了-O優化選項,assert將是一個空操作,編譯器不為assert語句生成代碼 。運行python不使用-O選項,則__debug__內置變量為True,否則為False。

? assert語句相當于下面代碼:

if??__debug__:if?not?condition?:raise??AssertionError,?<expression>
In?[17]:?assert?len(['my?boy',12])>10????#條件len(['my?boy',12])>10不滿足依法默認異常
--------------------------------------------------------------------------
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]不滿足依法默認異常
--------------------------------------------------------------------------
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'>


本文轉自 夢想成大牛 51CTO博客,原文鏈接:http://blog.51cto.com/yinsuifeng/1922560,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539982.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539982.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539982.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java應用一般架構

原文鏈接&#xff1a;http://www.iteye.com/news/31115 當我們架設一個系統的時候通常需要考慮到如何與其他系統交互&#xff0c;所以我們首先需要知道各種系統之間是如何交互的&#xff0c;使用何種技術實現。 1. 不同系統不同語言之間的交互 現在我們常見的不同系統不同語…

Mac MongoDB未正常關閉導致重啟失敗

你可以刪除掉mongod.lock文件&#xff0c;然后重新啟動&#xff0c;如果還是不可以&#xff0c;你可以查看一下進程&#xff0c;然后殺掉&#xff1a; ps -aef | grep mongo sudo kill 1076 再重啟數據庫即可。

微信企業號讓IOS不要識別數字為電話號碼的方法

最近在開發一個聯系人查看功能時&#xff0c;發現IOS端把 8位&#xff0c;11位的數字識別為了 電話號碼。 本來是黑色的樣式&#xff0c;變成了藍色的樣式&#xff0c;還添加了下劃線。點擊一下&#xff0c;還可以撥打電話。 這個問題要改&#xff0c;解決方法很簡單&#xf…

powerdns與nginx結合實現以域名和IP方式訪問web服務器80端口時分別跳轉到不同頁面...

1.powerdns設置 2.內部網站介紹 web服務器采用nginx&#xff0c;內網dns采用powerdns. 想實現的功能如下 通過ip訪問時跳轉到A頁面&#xff0c;通過域名訪問時&#xff0c;讓其跳轉到B頁面。兩種方式的端口均為80. 頁面A對應的nginx配置 server { listen 80; …

Installation error code: -103簽名不一致錯誤

調用Android系統的PackageInstallerActivity進行app安裝時&#xff0c;報Installation error code: -103 錯誤。 原因是&#xff1a;簽名問題。 可能是 1、正安裝的應用沒用簽名 2、正安裝的應用與已安裝的應用包相同&#xff0c;但簽名不同。 解決方法&#xff1a; 1、給…

java代碼塊是對象嗎_面向對象(Java中普通代碼塊,構造代碼塊,靜態代碼塊區別及代碼示例)...

//靜態代碼塊:在java中使用static關鍵字聲明的代碼塊。靜態塊用于初始化類&#xff0c;為類的屬性初始化。每個靜態代碼塊只會執行一次。由于JVM在加載類時會執行靜態代碼塊&#xff0c;所以靜態代碼塊先于主方法執行。//如果類中包含多個靜態代碼塊&#xff0c;那么將按照&quo…

Android adb命令選擇設備操作

當開了多個模擬器時&#xff0c;安裝app需要指定虛擬機&#xff0c;否則會提示&#xff1a;error: more than one device and emulator 1、先adb devices 查看設備列表 List of devices attached emulator-5554 device emulator-5556 device 2、使用命令 adb -s emulat…

java 視圖解析器_SpringMVC——視圖和視圖解析器

請求處理方法執行完成后&#xff0c;最終返回一個 ModelAndView對象。對于那些返回 String&#xff0c;View 或 ModeMap 等類型的處理方法&#xff0c;Spring MVC 也會在內部將它們裝配成一個ModelAndView 對象&#xff0c;它包含了邏輯名和模型對象的視圖Spring MVC 借助視圖解…

Android app 應用簽名

為什么要簽名&#xff1f; 這個要從Android的系統設計來解釋。 ---Android系統中的每個應用都是一個用戶&#xff0c;應用的包名&#xff08;清單文件中 package的值&#xff09;就是用戶名。 當一個已安裝的應用A和一個正要安裝的應用B&#xff0c;它們的包名相同&#xff…

[.Net線程處理系列]專題五:線程同步——事件構造

引言&#xff1a; 其實這部分內容應該是屬于專題四&#xff0c;因為這篇也是講關于線程同步的&#xff0c;但是由于考慮到用戶的閱讀習慣問題&#xff0c;因為文章太長了&#xff0c;很多人不是很愿意看包括我也是這樣的&#xff0c;同時也有和我說可以把代碼弄成折疊的&#x…

java redis set list_RedisTemplate的各種操作(set、hash、list、string)_lichuangcsdn的博客-CSDN博客...

注入以下RedisTemplateAutowiredprivate RedisTemplate redisTemplate;1、保存和讀取Set&#xff1a;代碼示例&#xff1a;SetOperations set redisTemplate.opsForSet(); set.add("set1","22"); set.add("set1","33"); set.add(&quo…

閃屏頁面(Splash)開發

業余作品--365安全衛士 ------------------------------------------- 閃屏頁面(Splash)&#xff1a;app剛啟動時的頁面 作用&#xff1a; 1、展示公司品牌logo 2、應用初始化。如游戲app第一次啟動初始化數據 3、檢測新版本。 4、檢測程序合法性。如 招商銀行app在啟動…

matlab2016b ubuntu命令行安裝 + matconvnet的安裝

0. 下載安裝包 下載的文件有Matlab 2016b Linux64 Crack.rar&#xff0c;R2016b_glnxa64_dvd2.iso&#xff0c;R2016b_glnxa64_dvd1.iso。 1. 拷貝安裝文件并上傳服務器 在Windows下用虛擬光驅打開&#xff0c;并將R2016b_glnxa64_dvd1.iso和R2016b_glnxa64_dvd2.iso所有內容復…

科普dip,dp,sp,dpi,ppi,px,Density

一、概念 DPI&#xff1a;DPI是Dots Per Inch的縮寫&#xff0c;也就是“每英寸點數”&#xff0c;打印機分辨率。這里所說的“點”&#xff0c;在屏幕上并不是不變的&#xff0c;并不是唯一對應屏幕上的像素點&#xff0c;而是受到分辨率等因素的影響。這個點有可能是1個像素…

do與mysql數據類型對照_dophon-db: dophon框架的數據庫模塊,支持mysql,sqlite數據庫,帶有orm持久化功能與鏈式操作實例,貼近邏輯習慣,支持mysql多數據源配置...

dophon-db項目介紹dophon框架的數據庫模塊,也可單獨作為一個與數據庫模塊交互的部件支持mysql數據庫連接支持orm形式的數據操作如有疑問請發送郵件聯系作者:ealohu163.com軟件架構模塊架構分為以組件:mysql連接組件(包括連接池,連接封裝類,分頁,結果輸出過濾器,遠程接收器,增量…

clamp 函數

返回范圍內的一個數值。可以使用 clamp 函數將不斷增加、減小或隨機變化的數值限制在一系列的值中。 float clamp(float minnumber, float maxnumber, float parameter) 最小數值和最大數值指定返回值的范圍。 參數是值要鉗制在范圍內的屬性或變量。 如果參數位于最小數值和最大…

jquery $.each遍歷json數組方法

轉載地址&#xff1a;http://blog.sina.com.cn/s/blog_636f2d150101ezs1.html <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.o…

java 責任鏈模式 鏈表_責任鏈模式的實現及源碼中應用

01—責任鏈模式的實現假設一個出差任務的流程需要審批出差行程和出差報銷金額。那么&#xff0c;對應兩個部門的審核。我們先定義一個出差任務Task類&#xff1a;然后&#xff0c;我們定義一個抽象的處理類Handler&#xff0c;其中具體的處理方法Handle交給子類去實現。然后&am…

JQuery $.each遍歷JSON字符串報Uncaught TypeError:Cannot use 'in' operator to search for

查看一個簡單的jQuery的例子來遍歷一個JavaScript數組對象。 [js] view plaincopy var json [ {"id":"1","tagName":"apple"}, {"id":"2","tagName":"orange"}, {"id":&quo…

php setcookie 過期,php cookie怎么設置過期時間?

PHP中可以使用setcookie()函數設置cookie的過期時間。語法為“setcookie(name,value,expire,path,domain,secure)”&#xff1b;其中expire參數用于指定cookie的有效期&#xff0c;即過期時間戳。setcookie() 函數向客戶端發送一個 HTTP cookie。cookie 是由服務器發送到瀏覽器…