Python 入門 —— Python 異常的捕獲,模塊的調用

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

執行如下:
這裏寫圖片描述
控制檯顯示如下:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章