什麼是異常?
異常就是一個事件,該事件會在程式執行過程中發生,影響了程式的正常執行。
一般情況下,在Python無法正常處理程式時就會發生一個異常。異常時Python對象,表示一個錯誤。
當Python腳本發生異常時我們需要捕獲處理它,否則程式會終止執行。
異常處理
捕捉異常可以使用try/except語句。
try/except 語句用來檢測try語句中的錯誤,進而讓except語句捕獲異常資訊并處理。
如果你不想在異常發生時結束你的程式,隻需要在try裡捕獲它。
文法:
1
2
3
4
5
6
7
8
<code>try:</code>
<code> </code><code><語句> </code><code>#正常運作的代碼</code>
<code>except <except_name>:</code>
<code> </code><code><語句> </code><code>#如果在try部分的代碼中引發了‘except_name’的異常,則執行此段代碼</code>
<code>except <except_name2>:</code>
<code> </code><code><語句> </code><code>#如果在try部分的代碼中引發了‘except_name2’的異常,則執行此段代碼</code>
<code>else</code><code>:</code>
<code> </code><code><語句> </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>>>> a = b =5</code>
<code>>>> 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>>>> 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,如需轉載請自行聯系原作者