天天看点

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,如需转载请自行联系原作者