天天看點

Python異常處理

什麼是異常?

異常就是一個事件,該事件會在程式執行過程中發生,影響了程式的正常執行。

一般情況下,在Python無法正常處理程式時就會發生一個異常。異常時Python對象,表示一個錯誤。

當Python腳本發生異常時我們需要捕獲處理它,否則程式會終止執行。

異常處理

捕捉異常可以使用try/except語句。

try/except 語句用來檢測try語句中的錯誤,進而讓except語句捕獲異常資訊并處理。

如果你不想在異常發生時結束你的程式,隻需要在try裡捕獲它。

文法:

1

2

3

4

5

6

7

8

<code>try:</code>

<code>     </code><code>&lt;語句&gt;  </code><code>#正常運作的代碼</code>

<code>except &lt;except_name&gt;:</code>

<code>     </code><code>&lt;語句&gt;  </code><code>#如果在try部分的代碼中引發了‘except_name’的異常,則執行此段代碼</code>

<code>except &lt;except_name2&gt;:</code>

<code>     </code><code>&lt;語句&gt;  </code><code>#如果在try部分的代碼中引發了‘except_name2’的異常,則執行此段代碼</code>

<code>else</code><code>:</code>

<code>      </code><code>&lt;語句&gt;  </code><code>#如果沒有發生異常,則執行此段代碼</code>

try的工作原理是,當開始一個try語句後,python就在目前程式的上下文中作标記,這樣當異常出現時就可以回到這裡,try子句先執行,接下來會發生什麼依賴于執行時是否出現異常。

1、如果當try後的語句執行時發生異常,python就跳回到try并執行第一個比對該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。

2、如果在try後的語句裡發生了異常,卻沒有比對的except子句,異常将被遞交到上層的try,或者到程式的最上層(這樣将結束程式,并列印預設的出錯資訊)。

3、如果在try子句執行時沒有發生異常,python将執行else語句後的語句(如果有else的話),然後控制流通過整個try語句。

9

10

11

12

13

<code>#!/usr/bin/python</code>

<code>#-*- coding:utf8 -*-</code>

<code>    </code><code>obj = </code><code>open</code><code>(</code><code>"logfile"</code><code>, </code><code>'w'</code><code>)</code>

<code>    </code><code>obj.write(</code><code>"這是一個測試檔案,用于測試異常!!"</code><code>)</code>

<code>except IOError:</code>

<code>    </code><code>print </code><code>"Error:沒有找到檔案或檔案不可寫入"</code>

<code>else</code><code>:</code>

<code>    </code><code>print </code><code>"檔案寫入成功"</code>

<code>    </code><code>obj.close()</code>

<code>#python except.py </code>

<code>檔案寫入成功</code>

去掉logfile檔案的寫入權限,在測試一次

<code>user2@localhost:~$ </code><code>chmod</code> <code>-w logfile </code>

<code>user2@localhost:~$ ll</code>

<code>total 28</code>

<code>drwxr-xr-x 3 user2 user2 4096 Jul 27 18:58 aaaa</code>

<code>drwxr-xr-x 6 user2 user2 4096 Jul 20 09:18 demo</code>

<code>-rw-r--r-- 1 root  root   265 Aug 11 11:21 except.py</code>

<code>-r--r--r-- 1 user2 user2   45 Aug 11 11:21 logfile</code>

<code>drwxr-xr-x 6 user2 user2 4096 Jul 10 13:32 </code><code>test</code>

<code>drwxr-xr-x 6 user2 user2 4096 Aug  3 18:50 YunboDBService</code>

<code>drwxr-xr-x 3 user2 user2 4096 Aug  3 09:58 zhouhai</code>

<code>user2@localhost:~$ python except.py </code>

<code>Error:沒有找到檔案或檔案不可寫入</code>

Python的異常類型:

<a href="http://s5.51cto.com/wyfs02/M02/85/AC/wKiom1er8QSDW2kMAAMTWpim6c0790.png" target="_blank"></a>

<a href="http://s2.51cto.com/wyfs02/M00/85/AB/wKioL1er8QazqY8OAALU2_p1KLs489.png" target="_blank"></a>

<a href="http://s5.51cto.com/wyfs02/M01/85/AC/wKiom1er8QjQOyLJAAKGz0pU5Yo034.png" target="_blank"></a>

如何捕獲所有異常?

Python所有的标準異常都是exception的一個子類。

<code>&gt;&gt;&gt; a = b =5</code>

<code>&gt;&gt;&gt; try:</code>

<code>...     print a*b+c</code>

<code>... except Exception, e:</code>

<code>...     print e</code>

執行結果:

<code>name </code><code>'c'</code> <code>is not defined</code>

通過以上方法,不管發生何種類型的異常,都會被捕獲到Exception中,但這也有一個弊端,就是無法知道程式究竟發生了何種異常情況。

try--finally語句:

try--finally語句無法是否發生異常都将執行最後的代碼

<code>&gt;&gt;&gt; a = b = 5</code>

<code>...     print a*B+c</code>

<code>... finally:</code>

<code>...     print a*b</code>

<code>...</code>

<code>name </code><code>'B'</code> <code>is not defined</code>

<code>25</code>

<a href="http://www.runoob.com/python/python-exceptions.html" target="_blank">http://www.runoob.com/python/python-exceptions.html</a>

本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1836814,如需轉載請自行聯系原作者