Python黑帽程式設計 2 7 異常處理

2021-08-16 17:49:35 字數 3129 閱讀 7271

異常是個很寬泛的概念,如果程式沒有按預想的執行,都可以說是異常了。遇到一些特殊情況沒處理會引發異常,比如讀檔案的時候檔案不存在,網路連線超時。程式本身的錯誤也可以算作異常,比如把字串當整數來處理,拼寫錯誤。

不論是系統還是框架,都會對基本異常進行分類,比如io異常,記憶體溢位等等。很多時候,針對特有的業務,我們也可以自定異常。

下面我們先看乙個引發異常的例子:

print 'hello'

這個例子很簡單,我們將print的首字母大寫。這會引發乙個錯誤:

我們可以觀察到有乙個syntaxerror被引發,並且檢測到的錯誤位置也被列印了出來。捕獲錯誤,列印錯誤資訊,這本身就是一種異常處理。那麼我們如何在**中處理異常呢?

2.7.1 try ….except

例如我們用如下**去開啟檔案:

open('abc.txt','r')

但是要開啟的檔案並不存在,這個時候程式就會丟擲異常,如下圖所示:

我們看到丟擲的錯誤為 ioerror,那麼我們可以使用如下的**來處理這個異常。

try:

open('abc.txt','r')

except ioerror,msg:

print msg

執行結果如下:

我們把所有可能引發錯誤的語句放在try塊中,然後在except從句中處理所有的錯誤和異常。except從句可以專門處理單一的錯誤或異常,或者一組包括在圓括號內的錯誤/異常。如果沒有給出錯誤或異常的名稱,它會處理 所有的 錯誤和異常。對於每個try從句,至少都有乙個相關聯的except從句。

例如:try:

open('abc.txt','r')

except ioerror,msg:

print msg

except:

print 'other erro'

如果某個錯誤或異常沒有被處理,預設的python處理器就會被呼叫。它會終止程式的執行,並且列印乙個訊息,我們已經看到了這樣的處理。

2.7.2 丟擲異常

我們可以使用raise語句 引發 異常。你還得指明錯誤/異常的名稱和伴隨異常 觸發的 異常物件。我們可以引發的錯誤或異常應該分別是乙個error或exception類的直接或間接匯出類。

我們先看示例**:

#!/usr/bin/python

class shortinputexception(exception):

'''a user-defined exception class.'''

def __init__(self, length, atleast):

exception.__init__(self)

self.length = length

self.atleast = atleast

try:

s = raw_input('enter something --> ')

if len(s) < 3:

raise shortinputexception(len(s), 3)

# other work can continue as usual here

except eoferror:

print '\nwhy did you do an eof on me?'

except shortinputexception, x:

print 'shortinputexception: the input was of length %d, \

was expecting at least %d' % (x.length, x.atleast)

else:

print 'no exception was raised.'

這段**中我們首先自定義了乙個shortinputexception類,它繼承自exception類,建構函式接受兩個引數輸入字串的長度和最小長度。接下來**中,我們獲取使用者輸入,判斷長度是否小於3,如果小於3觸發shortinputexception。我們從終端啟動這個指令碼,執行結果如下:

當我們需要不管是否有異常,都要執行某段**的時候,就需要finally出場了。看下面的示例:

def test1():

try:

print('to do stuff')

raise exception('hehe')

print('to return in try')

return 'try'

except exception:

print('process except')

print('to return in except')

return 'except'

finally:

print('to return in finally')

return 'finally'

test1return = test1()

print('test1return : ' + test1return)

在 try 中 raise乙個異常,就立刻轉入 except 中執行,在except 中遇到 return 時,就強制轉到 finally 中執行, 在 finally 中遇到 return 時就返回。執行結果如下:

2.7.9 小結

本節我們學習了python中基本的異常處理,和自定義異常的方法。

下一節我們學習套接字程式設計。

Python黑帽程式設計2 6 模組

我們已經學習了如何在你的程式中定義一次函式而重用 如果你想要在其他程式中重用很多函式,那麼你該如何編寫程式呢?你可能已經猜到了,答案是使用模組。模組基本上就是乙個包含了所有你定義的函式和變數的檔案。為了在其他程式中重用模組,模組的檔名必須以 py為副檔名。模組可以從其他程式匯入以便利用它的功能。這也...

Python 黑帽程式設計大綱(變化中)

教程說明 1.1 虛擬機器安裝和配置kali linux 2016 1.2 使用vscode 搭建python開發環境 1.3 python執行時與包管理工具 1.4 你必須知道的網路基礎理論 請自學 1.5 利用wireshark練習資料報解析 2.0 第二章概述 2.1 python程式設計哲學...

Python 黑帽程式設計大綱(變化中)

教程說明 1.1 虛擬機器安裝和配置kali linux 2016 1.2 使用vscode 搭建python開發環境 1.3 python執行時與包管理工具 1.4 你必須知道的網路基礎理論 請自學 1.5 利用wireshark練習資料報解析 2.0 第二章概述 2.1 python程式設計哲學...