Python中try...except...finally的理解

简介: 首先我们打开一个不存在的文件: fp = open("null.txt","r") 然后提示报错如下:---------------------------------------------------------------------------IOError ...

首先我们打开一个不存在的文件:

 fp = open("null.txt","r")

然后提示报错如下:
---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-3-f70973547c7e> in <module>()
----> 1 fp = open("null.txt","r")

IOError: [Errno 2] No such file or directory: 'null.txt'


接着我们使用try...except...来执行这条语句

In [4]: try:
   ...:     fp = open("null.txt","r")
   ...: except:
   ...:     print "open error"
   ...:     
open error



接着我们再在后面加一条finally语句,所谓的filally就是最后要执行的,它不管你前边是否发送错误
In [4]: try:
   ...:     fp =open('null.txt','r')
   ...: except:
   ...:     print 'opoen error'
   ...: finally:
   ...:     print 'end'
   ...:     
opoen error
end

    

接着我们使用except打印出错误类型,然后观察错误的type

In [5]: try:
   ...:     fp = open('null.txt','r')
   ...: except Exception,e:
   ...:     print e
   ...:     print type(e)
   ...:     
[Errno 2] No such file or directory: 'null.txt'
<type 'exceptions.IOError'>

我们可以看到except把错误捕捉到赋值给e,然后将其打印出,可以看到为IOError,所以在这里我们可以修改上边为:


In [9]: try:
   ...:     fp = open('null.txt', 'r')
   ...: except IOError,e:
   ...:     print "ioerror"
   ...:     
ioerror

当然这里如果不是IOError的话,上边except语句是捕捉不到的,例如:

In [10]: try:
   ....:     a = 10/0
   ....: except IOError,e:
   ....:     print "ioerror"
   ....:     
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-10-e17eff88239d> in <module>()
      1 try:
----> 2     a = 10/0
      3 except IOError,e:
      4     print "ioerror"
      5 

ZeroDivisionError: integer division or modulo by zero

这时我们需要另外的错误类型进行捕获,例如:


In [11]: try:
   ....:     a = 10/0
   ....: except IOError,e:
   ....:     print "IOError"
   ....: except ZeroDivisionError,e:
   ....:     print "Zero Error"
   ....:     
Zero Error
可以看到第一个except并没有捕捉到错误,所以传给下一个except,当然如果所有的except都没有捕获到的话,程序就会抛出异常

在这里我们不得不注意的是,python的错误类型其实都是class,所有的错误类型都继承自BaseException,所以在使用except时需要注意的是,它不但捕获该类型的错误,还把其子类也“一网打尽”。比如:

In [14]: try:
   ....:     a = 10 /0
   ....: except StandardError,e:
   ....:     print 'standardError'
   ....: except ZeroDivisionError,e:
   ....:     print 'zero error'
   ....:     
standardError

第二个 except永远也捕获不到 ValueError,因为 ZeroDivisionErrorStandardError的子类,如果有,也被第一个 except给捕获了。

使用try...except...finally的另外一个好处是,可以跨越多层调用,例如:

In [15]: def foo(m):
   ....:     return 10/int(m)
   ....: 

In [16]: def goo():
   ....:     a = "0"
   ....:     foo(a)
   ....:     

In [17]: def main():
   ....:     goo()
   ....:     

In [18]: try:
   ....:     main()
   ....: except Exception,e:
   ....:     print e
   ....:     
integer division or modulo by zero

在foo()函数中抛出的错误,然而在goo和main函数中都没有进行捕捉,在执行main函数时进行捕获,也可以捕获到


除了try...except...finally之外还有python的logging模块,也可以进行错误调试,当然我们也可以使用raise抛出异常

相关文章
|
数据库连接 Python
Python中的异常处理除了Try语句,你还会啥?
Python中的异常处理除了Try语句,你还会啥?
305 1
|
Python
|
人工智能 Shell 开发工具
[oeasy]python065python报错怎么办_try_试着来_except_发现异常
本文介绍了Python中处理异常的基本方法,重点讲解了`try`和`except`的用法。通过一个计算苹果重量的小程序示例,展示了如何捕获用户输入错误并进行处理。主要内容包括: 1. **回顾上次内容**:简要回顾了Shell环境、Python3游乐场和Vim编辑器的使用。 2. **编写程序**:编写了一个简单的程序来计算苹果的总重量,但发现由于输入类型问题导致结果错误。 3. **调试与修正**:通过调试发现输入函数返回的是字符串类型,需要将其转换为整数类型才能正确计算。
430 32
|
数据库 Python
[oeasy]python066_如何捕获多个异常_try_否则_else_exception
本文介绍了Python中`try...except...else`结构的使用方法。主要内容包括: 1. **回顾上次内容**:简要复习了`try`和`except`的基本用法,强调了异常处理的重要性。 2. **详细解释**: - `try`块用于尝试执行代码,一旦发现错误会立即终止并跳转到`except`块。 - `except`块用于捕获特定类型的异常,并进行相应的处理。 - `else`块在没有异常时执行,是可选的。 3. **示例代码**:通过具体例子展示了如何捕获不同类型的异常(如`ValueError`和`ZeroDivisionError`),并解释了异常处理
244 24
|
人工智能 数据库 开发者
[oeasy]python068_异常处理之后做些什么_try语句的完全体_最终_finally
介绍了 Python 中 `try` 语句的完全体,包括 `try`、`except`、`else` 和 `finally` 子句的使用。通过实例展示了如何捕获异常并输出详细的错误信息,如文件名和行号。特别强调了 `finally` 子句的作用,无论是否发生异常,`finally` 都会执行,常用于清理操作。最后总结了 `try` 语句的四个部分及其应用场景,并简要提及了 Python 社区的决策机制。 #try #except #else #finally
233 2
|
Python
Python 中的 try 和 except 块
【8月更文挑战第29天】
749 6
|
开发者 Python
在Python中,异常处理通过`try`、`except`、`else`和`finally`关键字进行
【6月更文挑战第26天】在Python中,异常处理通过`try`、`except`、`else`和`finally`关键字进行。基本结构包括尝试执行可能抛出异常的代码,然后指定`except`来捕获特定或任何类型的异常。`else`块在`try`无异常时执行,`finally`块确保无论是否发生异常都会执行,例如用于清理。可以使用`raise`重新抛出异常,而自定义异常则允许创建特定的错误类。这种机制增强了代码的健壮性。
588 7
|
定位技术 Python
Python的try、except异常处理模块使用方法
所以,我们就解决了由于可能具有的arcpy.ExecuteError异常而导致的程序中断问题;大家在实际使用时,按照自己程序中可能出现的报错类,对本文出现的arcpy.ExecuteError异常类加以修改即可。
|
Python
python的else块(可选)在try块成功执行且没有引发异常时执行
【5月更文挑战第12天】python的else块(可选)在try块成功执行且没有引发异常时执行
216 1
|
Python
python的try块包含可能会引发异常的代码
【5月更文挑战第12天】
165 1

推荐镜像

更多