1. 程式人生 > >Python Exception處理

Python Exception處理

Python中的錯誤處理分為兩類:語法錯誤和異常處理。語法錯誤一般是指由於python語句、表示式、函式等存在書寫格式活語法規則上的錯誤丟擲的異常,如python常見的縮排控制,若同層次的執行語句存在縮排不同,會報語法錯誤(SyntaxError),一般在ide中會有明顯的提示,其屬於編譯階段的錯誤,一般是導致解析錯誤丟擲錯誤;異常處理一般是指python語法格式正確,但在執行過程出現錯誤,錯誤型別交由python中的內建異常進行說明,回朔處理,這種型別的處理一般都是出現在執行階段,是需要我們處理的。如下給出兩種錯誤異常的簡單案例.

#語法異常,導致的解析錯誤

str="just show syntax type error."
print str,"\n" File "exception.py", line 21 print str,"\n" ^ IndentationError: unexpected indent #內建異常處理 s=None a=12 print a*s Traceback (most recent call last): File "exception.py", line 24, in exceptionDemo print a*s TypeError: unsupported operand type(s) for *: 'int' and 'NoneType'

如上,IndentationError屬於SyntaxError的派生子類,其和TypeError均是派生自Exception而來的,理論上來是Exceptioon可以說是python中所有異常的父類,但只是理論,除了Exception派生的異常內建類外還存在按鍵異常退出,系統異常退出等異常不屬於Exception派生的,根據層次結果,可以確認的是,python中所有異常的父類是BaseException(該類是從python2.5新增的),如下給出內建異常處理類的基本層次結構。

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
+-- GeneratorExit +-- Exception +-- StopIteration +-- StandardError | +-- BufferError | +-- ArithmeticError | | +-- FloatingPointError | | +-- OverflowError | | +-- ZeroDivisionError | +-- AssertionError | +-- AttributeError | +-- EnvironmentError | | +-- IOError | | +-- OSError | | +-- WindowsError (Windows) | | +-- VMSError (VMS) | +-- EOFError | +-- ImportError | +-- LookupError | | +-- IndexError | | +-- KeyError | +-- MemoryError | +-- NameError | | +-- UnboundLocalError | +-- ReferenceError | +-- RuntimeError | | +-- NotImplementedError | +-- SyntaxError | | +-- IndentationError | | +-- TabError | +-- SystemError | +-- TypeError | +-- ValueError | +-- UnicodeError | +-- UnicodeDecodeError | +-- UnicodeEncodeError | +-- UnicodeTranslateError +-- Warning +-- DeprecationWarning +-- PendingDeprecationWarning +-- RuntimeWarning +-- SyntaxWarning +-- UserWarning +-- FutureWarning +-- ImportWarning +-- UnicodeWarning +-- BytesWarning

而我們常見的自定義異常類一般均是繼承自Exception。如下部分也是主要介紹非系統錯誤,退出導致的異常的處理的相關用法。主要通過如下幾個方面介紹異常處理:

  • 異常捕獲
  • 異常丟擲
  • 異常自定義
  • 擴充套件清理操作預定義

異常捕獲

python中如果應為某些操作(如上的NoneType)導致異常,若是一直未能被捕獲,該異常將一直被傳遞,直至最後終止程式,丟擲回朔。我們可以通過在程式中預測異常的發生新增異常的捕獲處理,顯示友好的使用者互動提醒來防止程式的異常結束。python中的異常處理語句以及簡單的使用如下:


try:
    '捕獲異常的程式碼執行片段'
    s = None
    a = 12
    print a * s
except IOError:         #except為異常發生觸發執行片段關鍵詞,可以指定內建異常類型別,採用匿名型別,不獲取異常資訊
    print "catch IOError."
except TypeError as error: #捕獲異常定義異常變數,新的API採用'as'來指定變數名稱.
    print "catch TypeError.",error
except (UnboundLocalError,BufferError):    #捕獲異常定義捕獲的異常型別可以使用元組的形式新增多個捕獲的異常型別.
    pass          #pass無意義佔位關鍵字
except Exception,error:    #捕獲異常Exception,將捕獲所有的繼承自Exception型別的異常,該種定義異常變數的方法屬於老的api,新的api向下相容.
    print "catch Exception and use \',\' define param.",error
except:        #捕獲所有的異常型別包括系統異常退出等.
    pass
else:        #else為未發生異常執行的程式碼塊,必須在except之後
    print "no catch any Exception."
finally:    #finally不管有沒有出現異常均會執行,可以和try單獨使用,一般用於資源的關閉操作.

針對如上的示例,總結如下異常捕獲的關鍵點

  • 異常捕獲使用格式: try …except….
  try:
      statement...
  except:
      statement...
  • 異常捕獲可以指定異常捕獲型別,並可以指定異常變數,指定變數有兩種方式,一種通過’,’隔開,一種通過關鍵字’as’指定,格式如下:
  #','隔開

  try:
      statement...
  except Exception , error:
      pass


  #as指定
  try:
      statement...
  except Exception as error:
      pass
  • 捕獲多種型別的異常可以直接通過元組的方式新增多個異常型別,也可以通過多個except指定,如下:
#元組表示
try:
    statement...
except (TypeError,IOError):
    statement...


#多個except
try:
    statement...
except TypeError:
    statement...
except IOError:
    statement...
  • 使用else程式碼塊處理異常未發生的情況,如下:
try:
    statement...
except Exception , error:
    pass
else:
    statement... #沒有發生異常
  • 使用finally處理無論是否發生異常捕獲都執行的程式碼,可以直接通過和try單獨使用,也可以和except聯合使用(此種情況放在except,else後面)


#和except聯合使用
try:
    statement...
except Exception , error:
    pass
finally:
    statement...

#和try單獨使用
try:
    statement...
finally:
    statement...

異常丟擲

異常丟擲可以讓我們定義主動丟擲異常的邏輯,以提醒使用者需要進行某些必要的異常判斷或者處理,python中的異常丟擲使用關鍵字raise實現,raise的使用方式或者說是基本的使用場景可以分為三類:

  • 匿名丟擲

常用丟擲,可以直接指定丟擲異常類即可,如下:

raise IOError

Traceback (most recent call last):
  File "exception.py", line 84, in <module>
    raise IOError
IOError

  • 例項丟擲

例項丟擲可以新增異常丟擲顯示的提示文字內容,以便幫助定位異常問題,如下:


error=IOError("the file is not exists.")
raise error

Traceback (most recent call last):
  File "exception.py", line 85, in <module>
    raise error
IOError: the file is not exists.

  • 捕獲丟擲

這種丟擲不常見,但很使用,一般異常丟擲關鍵字raise是需要跟一個類或者變數,但這種丟擲不要新增任何其他資訊,屬於一種異常的傳遞,如下:


a = 12
s = None
try:
    print a*s
except Exception as error:
    if a < 10:
        pass
    else:
        raise   #丟擲異常.除了該種情況,raise後面必須要有異常資訊(類或者例項)

異常自定義

python中自定義異常一般是繼承Exception或者Exception的子類,可以預設繼承不做處理也可以通過對其進行定製,如下給出兩個示例,一個為簡單的整合,一個為重寫方法,如下:

#直接繼承不做處理
class DefException(Exception):
    pass


raise DefException("Def Exception")


Traceback (most recent call last):
  File "exception.py", line 101, in <module>
    raise DefException("Def Exception")
__main__.DefException: Def Exception


#重寫__init__
class CustomerException(Exception):
    KEY_CODE="code"
    KEY_MESSAGE="message"
    def __init__(self,**args):
        self.code=args[CustomerException.KEY_CODE]
        self.message=args[CustomerException.KEY_MESSAGE]

    def __str__(self):
        print repr(" throw code:%s,message:%s" % (self.code,self.message))

raise CustomerException(code=21,message="this is customer Exception")



#result
Traceback (most recent call last):
' throw code:21,message:this is customer Exception'
  File "/home/hfcai/Projects/PythonProjects/pythonNotes/exercises/basics/exception.py", line 115, in <module>
    raise CustomerException(code=21,message="this is customer Exception")
__main__.CustomerException

擴充套件清理操作預定義

這是python對於檔案操作提供的一個自動在操作完成後關閉的操作,使用關鍵字with實現,如下所示:


with open(name="./struct.py",mode="rb+")  as file:   #這是檔案的開啟操作.
     print file.read()               #檔案的讀取操作

如上,當執行完with下的程式碼塊,file會自動關閉,不論是否發生異常.

參考

相關推薦

Python Exception處理

Python中的錯誤處理分為兩類:語法錯誤和異常處理。語法錯誤一般是指由於python語句、表示式、函式等存在書寫格式活語法規則上的錯誤丟擲的異常,如python常見的縮排控制,若同層次的執行語句存在縮排不同,會報語法錯誤(SyntaxError),一般在ide

Python--異常處理--12

body traceback 語法 top 屬性 識別 依賴 內核 lin Python 異常處理 原創博文,轉載請標明出處--周學偉http://www.cnblogs.com/zxouxuewei/ python提供了兩個非常重要的功能來處理python程序在運行中出現

Python異常處理和進程線程-day09

.com bytes 出現 environ lar hold max oci sage 寫在前面 上課第九天,打卡:     最壞的結果,不過是大器晚成; 一、異常處理   - 1.語法錯誤導致的異常     - 這種錯誤,根本過不了python解釋

Python異常處理

處理 eas spa 服務 pen pan 發送 imp perror 1、URLError 錯誤產生原因: 網絡無連接,即本機無法上網 連接不到特定的服務器 服務器不存在 try: except 示例: import urllib2 requset = u

【代碼學習】PYTHON 異常處理

上下文 當前 異常處理 通過 工作 相同 try語句 標記 異常信息 一、什麽是異常   在程序執行過程中可能會影響程序的正常執行,一般情況下,在python無法正常處理程序時就會發生一個異常   當python腳本發生異常時我們需要捕獲處理他,否則程序會終止執行 二、異常

python exception的傳遞

exception python nbsp 行處理 傳遞 處理 就會 except 如果 try: block except1: except2: ... 如果block中出現了except,那麽會先取匹配except1,如果匹配了,進行處理,程序繼續執行。 如

python 異常處理

val cnblogs finall implement pytho 類型 indent lsp ces 一、try...except 有時候我們寫程序的時候,會出現一些錯誤或異常,導致程序終止。例如,做除法時,除數為0,會引起一個ZeroDivisionError 例子:

sandglass(沙漏)——一個讓人解脫的python時間處理

blank git over google nco trac 通過 對象 pytho 在遊戲開發的過程中頻繁的須要跟時間相關的做處理。而python內置了好多個時間處理庫,datetime/date/time/calendar/timedelta等,細節繁多略具迷惑

python--異常處理

ace blog 提示 1=1 兩種 常用 open pytho 允許 異常和錯誤 一:語法錯誤(這種錯誤,根本過不了python解釋器的語法檢測,必須在程序執行前就改正) #語法錯誤示範一 if #語法錯誤示範二 def test: pass #語法錯誤示範三

python selenium 處理時間日期控件(十五)

開發 users key 時間控件 java hunk read picker eat 測試過程中經常遇到時間控件,需要我們來選擇日期,一般處理時間控件通過層級定位來操作或者通過調用js來實現。 1.首先我們看一下如何通過層級定位來操作時間控件。 通過示例圖可以看到

Python-異常處理與調試

python 異常處理與調試一.錯誤1.有的錯誤是程序編寫有問題造成的,比如本來應該輸出整數結果輸出了字符串,這種錯誤我們通常稱之為 bug,bug 是必須修復的。2.有的錯誤是用戶輸入造成的,比如讓用戶輸入 email 地址,結果得到一個空字符串,這種錯誤可以通過檢查用戶輸入來做相應的處理。3.還有一類錯誤

JAVA Exception處理

++ 變量 ssd 編譯 lar 異常信息 虛擬機 key use 原文地址:http://blog.csdn.net/hguisu/article/details/6155636 1. 引子 try…catch…finally恐怕是大家再熟悉不過的語句了

Python-異常處理

msg 其他 pri nal 類型 __init__ span 不存在 除法 一、捕獲異常 1、當程序出錯時,不會展示bug信息給用戶,而是提供一個友好的提示後,繼續執行程序 2、如下,實現除法,當分母為0時,捕獲並打印出異常信息;Exception可以捕獲任何異常 de

Python 日誌處理(二) 使用正則表達式處理Nginx 日誌

表示 cnblogs sunday sta return __main__ pattern eth 解析 使用正則表達式來處理Nginx 日誌 一、 先對單行的日誌進行分組正則匹配,返回匹配後的結果(字典格式): from datetime import dateti

day14-python異常處理

val ioerror python異常 memory enc ast 標記 tor back 1. 異常 異常即是一個事件,該事件會在程序執行過程中發生,影響了程序的正常執行。 一般情況下,在Python無法正常處理程序時就會發生一個異常。異常是Python對象,

python xml 處理

rem enc aaaaa imp name span find root don import xml.etree.ElementTree as ET ‘‘‘ xml處理模塊 ‘‘‘ from idlelib.IOBinding import encoding

Python圖片處理 生產4位驗證碼

color class ext string int 填充 分享圖片 www 背景 圖像處理是一門應用非常廣的技術,而擁有非常豐富第三方擴展庫的 Python 當然不會錯過這一門盛宴。PIL (Python Imaging Library)是 Python 中最常用的圖像處

python-json處理

ict dict dumps asc 寫入 phone count 引號 雙引號 1、json 串就是字符串 2、需要提前引入, 即import 3、將list /字典等 轉化為json數據類型:json.dumps() #json.dumps(d) #把lis

一文掌握 Python 異常處理的所有知識點

原因 情況 例如 microsoft interrupt center 簡單 兩個 修復 異常處理在任何一門編程語言裏都是值得關註的一個話題,良好的異常處理可以讓你的程序更加健壯,清晰的錯誤信息更能幫助你快速修復問題。在Python中,和部分高級語言一樣,使用了try/ex

python -- DNS處理模塊dnspython

size 實例 郵件 arp query resp port 解析結果 一級域名 簡介 dnspython – 是python實現的一個DNS工具包,利用其查詢功能來實現dns的服務監控及解析結果的校驗 安裝dnspython pip install