Python 中异常嵌套

在Python中,异常也可以嵌套,当内层代码出现异常时,指定异常类型与实际类型不符时,则向外传,如果与外面的指定类型符合,则异常被处理,直至最外层,运用默认处理方法进行处理,即停止程序,并抛出异常信息。如下代码:

try:
    try:
        raise IndexError
    except TypeError:
        print(‘get handled‘)
except SyntaxError:
    print(‘ok‘)

运行程序:

Traceback (most recent call last):
  File "<pyshell#47>", line 3, in <module>
    raise IndexError
IndexError

再看另一个被外层try-except捕获的例子:

try:
    try:
        1/0
    finally:
        print(‘finally‘)
except:
    print(‘ok‘)

运行:

finally
ok

这里值得注意的是except:可以捕获所有的异常,但实际上这样做也有缺点,即有时候会包住预定的异常。

另外,需要提到的是raise A from B,将一个异常与另一个异常关联起来,如果from后面的B没有被外层捕获,那么A,B异常都将抛出,例如:

try:
    1/0
except Exception as E:
    raise TypeError(‘bad‘) from E

运行:

Traceback (most recent call last):
  File "<pyshell#4>", line 2, in <module>
    1/0
ZeroDivisionError: division by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<pyshell#4>", line 4, in <module>
    raise TypeError(‘bad‘) from E
TypeError: bad

相反,如果外层捕获了B:

try:
    try:
        1/0
    except Exception as E:
        raise TypeError from E
except TypeError:
    print(‘no‘

运行:

no

最后,再看看try-finally在嵌套中的表现。

 try:
    try:
        1/0
    finally:
        print(‘finally‘)
except:
    print(‘ok‘)

运行:

finally
ok

不管有没有异常发生,或者其是否被处理,finally的代码都要执行,如果异常被处理,则停止,如果没有被处理,向外走,直至最终没处理,采用默认方法处理,上例中,异常在最外层被处理。

try:
    try:
        1/0
    except Exception as E:
        print(‘happens‘)
    finally:
        print(‘finally‘)
except E:
    print(‘get handled‘)

运行:

happens
finally

异常在内部被处理,不再向外传播。

原文地址:https://www.cnblogs.com/johnyang/p/10409153.html

时间: 2024-10-29 04:20:57

Python 中异常嵌套的相关文章

四十二、python中异常

1.常用异常: AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性xIOError 输入/输出异常:基本上是无法打开文件ImportError 无法引入模块或包:基本上是路径问题或名称错误IndentationError 语法错误(的子类) :代码没有正确对齐IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]KeyError 试图访问字典里不存在的键KeyboardInterrupt Ctrl+C被按下NameError

python中的嵌套类(内部类调用外部类中的方法函数)

在为书中版本是3.X的,但2.X不太支持直接调用. 所以,在PYTHON2.X中,要在内部类中调用外部类的方法,就必须得实例化外部类,然后,传入实例进行调用. 花了我两个小时啊,资料没找到,自己一个一个想法调试,真的失败了三四十次,PRINT了N多~~~:) class DiagramFactory: @classmethod def make_diagram(Class, width, height): return Class.Diagram(width, height) @classmet

Python中字典嵌套??

如dict={1:'a',2:'b'},要得到一个字典dict={1:'a',2:'b',3:{1:'a',2:'b'}} 1 >>> dict={1:'a',2:'b'} 2 >>> dict 3 {1: 'a', 2: 'b'} 4 >>> dict[3]={1: 'a'} 5 >>> dict 6 {1: 'a', 2: 'b', 3: {1: 'a'}} 7 >>> dict[3].update({2: 'b

python中异常的介绍

每个异常都是一 些类的实例,这些实例可以被引发,并且可以用很多种方法进行捕捉,使得程序可以捉住错误并且对其进行处理 >>> 1/0 Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> 1/0 ZeroDivisionError: integer division or modulo by zero 异常处理 捕捉异常可以使用try/except语句

Python中异常打印——面向程序猿

import logging # logging.disable(logging.CRITICAL) logging.basicConfig(filename="loggingBug.txt",level=logging.DEBUG,format="%(asctime)s-%(levelname)s-%(message)s") def factorial(num): total=1 logging.debug("开始运行:{}".format(n

Python&lt;2&gt;异常基础

在Python中异常通常可以用于各种用途,下面是最常见的几种. <1>错误处理 每当运行时检测到错误,Python的默认异常处理行为将启动(停止程序,打印错误信息).如果不想启动这种默认 行为,就要写try语句捕捉异常并从异常中恢复.当检测到错误是,Python会跳到try处理器,程序在try之后会接着 继续运行. <2>事件通知 发出有效状态的信号 <3>特殊情况处理 很难调整代码去处理的问题 <4>终止行为 <5>非常规流程控制 异常是一种高

三十五:python中的异常

Python提供了两个非常重要的功能来处理异常和错误: 1)   异常处理try-.except 2)   断言assert 异常和断言,可以用于我们调试python程序,跟踪程序执行状态,尽快排查问题. 35.1 python中的标准异常 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 StopIteration 迭代器没有更多的值 Gene

Python中获取异常(Exception)信息

异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序结构.如下所示 try: ... except Exception as e: ... 1.str(e) 返回字符串类型,只给出异常信息,不包括异常信息的类型,如1/0的异常信息 'integer division or modulo by zero' 2.repr(e) 给出较全的异常信息,包括异

python中try except处理程序异常的三种常用方法

如果你在写python程序时遇到异常后想进行如下处理的话,一般用try来处理异常,假设有下面的一段程序: try: 语句1 语句2 ... 如果你在写python程序时遇到异常后想进行如下处理的话,一般用try来处理异常,假设有下面的一段程序: 1 2 3 4 5 6 7 8 try:     语句1     语句2     .     .     语句N except .........:     do something ....... 但是你并不知道"语句1至语句N"在执行会出什