Python 異常的捕獲,模塊的調用
1 異常
- Python 使用被稱爲異常的特殊對象來管理程序執行期間發生的錯誤。每當發生讓 Python 不知所措的錯誤時,它都會創建一個異常對象。如果你編寫了處理該異常的代碼,程序將繼續運行;如果你未對異常進行處理,程序將停止,並顯示一個 traceback (回溯),其中包含有關異常的報告。
異常是使用 try-except 代碼塊處理的。 try-except 代碼塊讓 Python 執行指定的操作,同時告訴 Python 發生異常時怎麼辦。使用了 try-except 代碼塊時,即便出現異常,程序也將繼續運行:顯示你編寫的友好的錯誤消息,而不是令用戶迷惑的 traceback(回溯) 。- 簡單的說,在程序開發中,如果對某些代碼的執行不確定(程序語法完全正確)
1.1 通過 try 來進行簡單的異常捕獲
語法如下:
try:
嘗試執行的代碼
expect:
出現錯誤的處理
示例:編寫一簡單的代碼段,無語法錯誤,並使其產生異常
num = int(raw_input('Please input a num:'))
# 一個簡單的交互式變量定義,要求輸入的必須爲整型變量
'Please input a num type int'
執行如下:返回一個字符串類型,將會報錯,因爲報錯,所以不會繼續執行下面的print語句
通過錯誤類型,可對其進行抓取,讓程序繼續執行
try:
num = int(raw_input('Please input a num:'))
except:
print 'Please input a num type int'
# 無論執行是否正確,都會顯示
print '#' * 50
執行如下:
控制檯顯示如下:
1.2 捕獲指定錯誤:
- 當python解釋器拋出異常時,最後一行錯誤信息的第一個單詞,就是錯誤類型
可通過指定異常類型,對其進行捕捉,從而決定下一步程序的執行
語法
try:
pass
except 錯誤類型:
pass
通過指定錯誤類型,來進行捕獲異常
try:
num = float(raw_input('Please in put a num: '))
result = 8 / num
print result
except ZeroDivisionError:
print "0 false,0 can't be the divisor"
except ValueError:
print "Please input a num type int"
執行如下:
輸入0,控制檯顯示:
輸入非整型字符,控制檯顯示:
1.3 捕獲未知錯誤
- 我們無法預見所有的程序將會出現的非語法性錯誤,因此需要藉由捕獲未知的錯誤
語法:
except Exception as
示例
try:
num = float(raw_input('Please in put a num: '))
result = 8 / num
print result
except ValueError:
print "Please input a num type float."
except Exception as result:
print "Unknown error: %s" % result
執行如下:
控制檯顯示:
1.4 捕獲異常意外的輸出,正確輸出與最終輸出
- 除了可能出現的異常清況外,還有正確的輸入與輸出,可以對此進行註釋,或動作的添加
語法: 捕獲異常的最終形式
try:
# 嘗試執行的代碼
pass
except: 錯誤類型1
pass
excpet: 錯誤類型2
pass
except Exeption
else:
# 沒有異常纔會執行的代碼
pass
finall:
# 無論是否有異常都會執行的代碼
pass
示例:
try:
# 嘗試執行的錯誤
num = float(raw_input('Please in put a num: '))
result = 8 / num
print result
# 捕獲執行錯誤類型
except ValueError:
print "Please input a num type float."
# 捕獲未知異常
except Exception as result:
print "Unknown error: %s" % result
# 沒有出現異常時纔會執行的代碼
else:
print "Execute successfully!"
# 無論是否異常,都會執行的代碼
finally:
print "End"
執行如下:
控制檯顯示如下:
1.5 異常的傳遞性
- 異常的傳遞
當函數/方法執行出現異常,會將異常傳遞給函數/方法調用的一方如果傳遞到主程序, 依舊沒有異常處理,程序纔會終止,可以在主程序中增加
異常捕獲,而在主函數中調用其他函數,只要出現異常,都會傳遞到主函數的異常捕獲中,這就不需要在代碼中,增加大量的異常捕獲,能夠保證代碼的整潔
示例:一個可正確執行的代碼段,因爲錯誤輸出,出現異常
def demo1():
return int(raw_input('Please input a num: '))
def demo2():
return demo1()
print demo2()
執行如下:
控制檯顯示如下:
對其異常進行捕獲:
def demo1():
return int(raw_input('Please input a num: '))
def demo2():
return demo1()
try:
print demo2()
except Exception as result:
print 'Unknown error:%s' % result
執行如下:
控制檯顯示如下:
1.6 拋出異常並捕獲
- 爲了滿足一些限定需求,有時需要進行主動的對異常的拋出,並對其進行捕獲操作
示例:
- 判斷用戶輸入的密碼
1.<8 錯誤
2.>=8 返回輸入的密碼
進行異常的拋出
def password():
passwd = raw_input('Please input passwd:')
if len(passwd) >= 8:
return passwd
# 創建異常對象(可添加錯誤信息)
error = Exception('The passwd is too short')
raise error
執行如下:
控制檯顯示如下:
對拋出的錯誤進行捕獲:
def password():
passwd = raw_input('Please input passwd:')
if len(passwd) >= 8:
return passwd
# 創建異常對象(可添加錯誤信息)
error = Exception('The passwd is too short')
raise error
# 注意:只拋出異常而不捕獲,代碼會顯示錯誤
try:
print password()
except Exception as result:
print 'error:%s ' % result
執行如下:
控制檯顯示如下:
1.7 斷言
- python assert 斷言句語格式及用法很簡單。在沒完善一個程序之前,我們不知道程序在哪裏會出錯,與其讓它在運行最崩潰,不如在出現錯誤條件時就崩潰,這時候就需要assert斷言的幫助。
- 斷言:可理解爲提前預言,讓人更好的知道錯誤原因
示例:
def test(num,div):
assert (div != 0) # 規定。div不能等於 0
return num / div
print test(10,0)
執行如下:
控制檯顯示如下:顯示錯誤
可通過斷言進行預見
執行如下:
2 模塊
- python函數的優點之一是:使用它們可將代碼塊與主程序分離。通過給函數指定描述性名稱,可讓主程序容易理解得多。你還可以更進一步,將函數存儲在被稱爲模塊 的獨立文件中,再將模塊導入 到主程序中。 import 語句允許在當前運行的程序文件中使用模塊中的代碼。
通過將函數存儲在獨立的文件中,可隱藏程序代碼的細節,將重點放在程序的高層邏輯上。這還能讓你在衆多不同的程序中重用函數。將函數存儲在獨立文件中後,可與其他程序員共享這些文件而不是整個程序。知道如何導入函數還能讓你使用其他程序員編寫的函數庫。- 類同樣也可以進行跨模塊調用
定義兩個模塊再對其進行跨模塊調用
模塊一:
test1 = "I'm module 1"
def say_hello():
print test1
class Car(object):
def __init__(self, name):
self.name =name
def __str__(self):
return self.name
執行如下:
模塊二:
test2 = "I'm module 2"
def say_hello():
print test2
class Plane(object):
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
執行如下:
進行調用:
導入方法1:直接導入
import test1
import test2
test1.say_hello() # 調用函數
BMW = test1.Car('BMW') # 調用類,進行對象的建立
print BMW
test2.say_hello()
B747 = test2.Plane('747')
print B747
執行如下:
控制檯顯示如下:
導入方法2:給模塊起別名
# 給模塊起別名:
import test1 as CarModule
import test2 as PlaneModele
CarModule.say_hello() # 調用函數
BMW = CarModule.Car('BMW') # 調用類,進行對象的建立
print BMW
PlaneModele.say_hello()
B747 = PlaneModele.Plane('747')
print B747
執行如下:
控制檯顯示如下:
導入方法3:
from test1 import Car
from test2 import Plane
from test1 import say_hello
from test2 import say_hello as test2_say_hello
say_hello() # 調用函數,test1 的函數
test2_say_hello() # # 調用函數,test2 的函數
BMW = Car('BMW') # 調用類,進行對象的建立
print BMW
B747 = Plane('747')
print B747
此種方法導入是爲了更加具體的進行導入,調用時更加方便,重新定義函數名是爲了區別不同模塊的同名函數
執行如下:
控制檯顯示如下:
模塊調用時出現的問題
1.建立模塊不能與系統中已有的模塊重名
- python的解釋器再導入模塊的時候,會
1.搜索當前目錄指定的模塊文件,如果有就直接導入
2.如果沒有,再搜索系統目錄
因此建立模塊不能與系統中已有的模塊重名
示例:對隨機數進行調用
定義一個與random相同的模塊,在其中進行調用
import random
num = random(1,10)
print num
執行如下:
控制檯顯示如下:會報錯
若是刪除此模塊
隨意定義一與random不同的模塊
import random
rand = random.randint(1,10)
print rand
執行如下:
控制檯顯示如下:,成功產生隨機數
模塊調用時,未進行函數調用,自動顯示結果
- 在進行模塊調用時,我們僅僅調用了模塊,沒有想對其內容進行操作,但是,模塊中的各項被調用了。爲了避免這種情況的發生,我門可以用控制語句對被調用模塊的內容進行限制
name屬性
name屬性可以做到,測試模塊的代碼只在測試情況下被運行,二再導入時不會被運行
name是python的一個內置屬性,記錄着一個字符串
如果是被其他文件導入時,name就是模塊名
如果是當前執行的程序,name就是main
模塊 _ name _
def demo():
print 'Hello'
print 'Surprise!!'
demo()
print __name__
執行如下:
控制檯結果如下:
跨模塊調用
調用模塊:
import __name__
執行如下:
控制檯顯示如下:
我們僅僅調用了模塊,沒有想對其內容進行操作,但是,模塊中的各項被調用了
爲了避免這種情況的發生,我門可以用控制語句對被調用模塊的內容進行限制
__name__2 模塊:
def demo():
print 'Hello'
if __name__ == '__main__':
print 'Surprise!!'
demo()
執行如下:
控制檯顯示如下:
對其進行調用
調用模塊
import __name__2
執行如下:
控制檯顯示如下: