天天看點

Python之異常處理、子產品與包錯誤與異常處理子產品與包

MarkdownPad Document

文法錯誤:過不了Python解釋器

邏輯錯誤

Python解釋器檢測到錯誤,觸發異常,在發生異常時捕捉異常,如果捕捉成功則進入另外一個處理分支,是程式不會崩潰,這就是異常處理 異常處理機制就是來增強程式的健壯性與容錯性

基本文法

exception萬能異常,不管抛出什麼異常都能捕捉到,用一種方法去處理,但是如果想對于不同的異常需要定制不同的處理邏輯,還是要用多分支進行處理

異常的其他形式

主動抛出異常

自定義異常

斷言

try..except的方式比較if的方式的好處

把錯誤處理和真正的工作分開來

代碼更易組織,更清晰,複雜的工作任務更容易實作

毫無疑問,更安全了,不至于由于一些小的疏忽而使程式意外崩潰了

try..except這種異常處理機制就是取代if那種方式,讓你的程式在不犧牲可讀性的前提下增強健壯性和容錯性 異常進行中為每一個異常定制了異常類型(python中統一了類與類型,類型即類),對于同一種異常,一個except就可以捕捉到,可以同時處理多段代碼的異常(無需‘寫多個if判斷式’)減少了代碼,增強了可讀性
try...except應該盡量少用,因為它本身就是你附加給你的程式的一種異常處理的邏輯,與你的主要的工作是沒有關系的,這種東西加的多了,會導緻你的代碼可讀性變差,隻有在有些異常無法預知的情況下,才應該加上try...except,其他的邏輯錯誤應該盡量修正

一個子產品就是一個包含了Python定義和聲明的檔案,檔案名就是子產品名字加上.py的字尾

随着程式的發展,功能越來越多,為了友善管理,通常将程式分成一個個的檔案,這樣程式的結構更加清晰,友善管理,這時不僅僅可以把檔案當做腳本去執行,還可以當做子產品導入到其他子產品中,實作了功能的重複利用。

導入子產品會觸發以下事件:

第一件事:建立名稱空間,用來存放所導入子產品中定義的名字

第二件事:基于剛剛建立的名稱空間執行所導入的子產品

第三件事:建立子產品名指向該名稱空間,子產品.名字 進行操作

子產品可以包含可執行的語句和函數的定義,這些語句的目的是初始化子產品,它們隻在子產品名第一次遇到導入import語句時才執行(import語句是可以在程式中的任意位置使用的,且針對同一個子產品很import多次,為了防止你重複導入,python的優化手段是:第一次導入後就将子產品名加載到記憶體了,後續的import語句僅是對已經加載大記憶體中的子產品對象增加了一次引用,不會重新執行子產品内的語句)。

可以為子產品起别名 import time as mytime print(mytime.time())

可以在一行導入多個子產品,但不建議這麼做

使用此種方式導入的子產品,可以直接使用被導入子產品中命名空間的名字,而不用再使用子產品名.名字 的方式了,但是此時如果有重名的會有覆寫的效果,原理就是python中的變量指派不是一種存儲操作,而隻是一種綁定關系

from...import*

可以将所有不是以下劃線開頭的名字都導入到目前位置,但是一般不建議這麼做,因為不知道導入了哪些名字,有可能會覆寫掉之前已經定義的名字,而且可讀性差。 可以使用all來控制*(用來釋出新版本時)

可以通過子產品的全局變量name來檢視子產品名name = 'main' #當做腳本運作

加載子產品時先看記憶體中是否加載---再找同名的内模組化塊---再找sys.path給出的目錄清單

需要特别注意的是:自定義的子產品名不要與系統的内置子產品重名

包是一種通過使用‘.子產品名’來組織python子產品名稱空間的方式

包的本質就是一個包含init.py檔案的目錄

凡是在導入時帶點的,點的左邊都必須是一個包,但是導入後在使用時就沒有這種限制了,點的左邊可以是包、子產品、函數、類

from後的import導入的子產品必須是明确的一個,不能帶點,否則會有文法錯誤

第一次導入包或者是包的任何其他部分,都會依次執行包下的init.py檔案,此檔案可以為空也可以放一些初始化包的代碼

絕對導入:以最頂層的包作為起始

相對導入:用'.'、'..'的方式作為起始(隻能在一個包中使用,不能用于不同目錄内)

需要特别注意的是:可以用import導入内置或者第三方的子產品,但是要絕對避免使用import來導入自定義包的子子產品,應該使用from...import...的絕對或者相對導入,且包的相對導入隻能用from的形式

本文轉自 AltBoy 51CTO部落格,原文連結:http://blog.51cto.com/altboy/1921182