1. 程式人生 > >Python基礎之(異常與開發規範)

Python基礎之(異常與開發規範)

一、異常

1.1、Python中錯誤分為兩種:

  • 語法錯誤,這種錯誤根本過不了python直譯器的語法檢測,必須在程式執行前就改正
  • 邏輯錯誤,如int("m")

異常就是程式執行時發生錯誤的訊號(在程式出現錯誤時,則會產生一個異常,若程式沒有處理它,則會丟擲該異常,程式的執行也隨之終止),在python中,錯誤觸發的異常如下:

python中異常的種類:

 1 #常用異常
 2 AttributeError 試圖訪問一個物件沒有的樹形,比如foo.x,但是foo沒有屬性x
 3 IOError 輸入/輸出異常;基本上是無法開啟檔案
 4 ImportError 無法引入模組或包;基本上是路徑問題或名稱錯誤
5 IndentationError 語法錯誤(的子類) ;程式碼沒有正確對齊 6 IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5] 7 KeyError 試圖訪問字典裡不存在的鍵 8 KeyboardInterrupt Ctrl+C被按下 9 NameError 使用一個還未被賦予物件的變數 10 SyntaxError Python程式碼非法,程式碼不能編譯(個人認為這是語法錯誤,寫錯了) 11 TypeError 傳入物件型別與要求的不符合 12 UnboundLocalError 試圖訪問一個還未被設定的區域性變數,基本上是由於另有一個同名的全域性變數,
13 導致你以為正在訪問它 14 ValueError 傳入一個呼叫者不期望的值,即使值的型別是正確的 15 16 #更多異常 17 ArithmeticError 18 AssertionError 19 AttributeError 20 BaseException 21 BufferError 22 BytesWarning 23 DeprecationWarning 24 EnvironmentError 25 EOFError 26 Exception 27 FloatingPointError 28 FutureWarning 29 GeneratorExit 30 ImportError
31 ImportWarning 32 IndentationError 33 IndexError 34 IOError 35 KeyboardInterrupt 36 KeyError 37 LookupError 38 MemoryError 39 NameError 40 NotImplementedError 41 OSError 42 OverflowError 43 PendingDeprecationWarning 44 ReferenceError 45 RuntimeError 46 RuntimeWarning 47 StandardError 48 StopIteration 49 SyntaxError 50 SyntaxWarning 51 SystemError 52 SystemExit 53 TabError 54 TypeError 55 UnboundLocalError 56 UnicodeDecodeError 57 UnicodeEncodeError 58 UnicodeError 59 UnicodeTranslateError 60 UnicodeWarning 61 UserWarning 62 ValueError 63 Warning 64 ZeroDivisionError
異常種類

 

1.2、異常處理

python直譯器檢測到錯誤,觸發異常(也允許程式設計師自己觸發異常)程式設計師編寫特定的程式碼,專門用來捕捉這個異常(這段程式碼與程式邏輯無關,與異常處理有關)如果捕捉成功則進入另外一個處理分支,執行你為其定製的邏輯,使程式不會崩潰,這就是異常處理

為什麼需要異常處理?

python解析器去執行程式,當檢測到了一個錯誤時就會觸發異常,異常觸發後且沒被處理的情況下,程式就在當前異常處終止,後面的程式碼不會執行,誰會去用一個執行著突然就崩潰的軟體。所以你必須提供一種異常處理機制來增強你程式的健壯性與容錯性 

怎樣進行異常處理?

  • 如果錯誤發生的條件是可預知的,我們需要用if進行處理:在錯誤發生之前進行預防
  • 如果錯誤發生的條件是不可預知的,則需要用到try...except:在錯誤發生之後進行處理
#if
m = input(":")
if type(m) is int:
    print(m)
elif len(m) == 0:
    print("xxx")
else:
    print(len(m))
    print("錯誤")

#try...except
#基本語法為:
try:
    被檢測的程式碼塊
except 異常型別:
    try中一旦檢測到異常,就執行這個位置的邏輯

m = input(":")
try:
    int(m)
except Exception as e:
    print(e)

Ps:萬能異常類:Exception

#主動觸發異常raise
try:
    raise TypeError('型別錯誤')
except Exception as e:
    print(e)

 

二、軟體開發規範

2.1、為什麼需要規範軟體開發

你現在包括之前寫的一些程式,所謂的'專案',都是在一個py檔案下完成的,程式碼量撐死也就幾百行,你認為很好。但是真正的後端開發的專案,系統等,少則幾萬行程式碼,多則十幾萬,幾十萬行程式碼,你全都放在一個py檔案中行麼?這顯然是不行的。我們需要有一個較好的規範才能保證在開發過程中不混亂或者叫雜亂無章。軟體開發首先規範你的專案目錄結構,程式碼規範,遵循PEP8規範等等,讓你更加清晰、合理的開發。

2.2、設計專案目錄結構

"設計專案目錄結構",就和"程式碼編碼風格"一樣,屬於個人風格問題。對於這種風格上的規範,一直都存在兩種態度:

  • 一類程式設計師認為,這種個人風格問題"無關緊要"。理由是能讓程式work就好,風格問題根本不是問題。
  • 另一類認為,規範化能更好的控制程式結構,讓程式具有更高的可讀性

我是比較偏向於後者的,因為我是前一類程式設計師思想行為下的直接受害者。我曾經維護過一個非常不好讀的專案,其實現的邏輯並不複雜,但是卻耗費了我非常長的時間去理解它想表達的意思。從此我個人對於提高專案可讀性、可維護性的要求就很高了。"專案目錄結構"其實也是屬於"可讀性和可維護性"的範疇,我們設計一個層次清晰的目錄結構,就是為了達到以下兩點:

  • 可讀性高: 不熟悉這個專案的程式碼的人,一眼就能看懂目錄結構,知道程式啟動指令碼是哪個,測試目錄在哪兒,配置檔案在哪兒等等。從而非常快速的瞭解這個專案。
  • 可維護性高: 定義好組織規則後,維護者就能很明確地知道新增的檔案和程式碼應該放在什麼目錄之下。這個好處是,隨著時間的推移,程式碼/配置的規模增加,專案結構不會混亂,仍然能夠組織良好

較好的目錄結構如下:

具體說明:

#bin 啟動檔案
#conf 配置檔案
#core 主程式
#db  資料庫
#lib  第三方庫
#log  日誌
#readme 
軟體定位,軟體的基本功能程式碼目錄結構說明,更詳細點可以說明軟體的基本原理
執行程式碼的方法: 安裝環境、啟動命令等
常見問題說明