微信公众号:数据分析与统计学习
如有问题或建议,请公众号留言
最近更新时间:2018-7-2
Python的系列文章主要介绍python语言的基础语法知识。按照核心内建数据类型、语句、函数、类、异常、标准模块的顺序对相关的语法知识进行讲解。
上期小编介绍了类的介绍类的运算符重载和类装饰器。本期小编将会详细介绍异常,异常也可以改变程序中的控制流程。
pythony异常知识的介绍包括异常的基础知识,异常的语句、异常的类和异常的设计。
在Python中,异常会根据错误自动地被触发,也能由代码触发和截获。异常由四个语句处理,如下:
try/except:捕捉Python或你引起的异常并恢复
try/finally:无论异常是否发生,执行清理行为
raise:手动在代码中触发异常
assert:有条件地在程序代码中触发异常
with/as:实现环境管理器
异常的用途
1、错误处理:每当代码在运行时检测到错误,Python就会引发异常。我们可以在代码中捕捉和响应错误,或者忽略已发生的异常。如果忽略错误,Python默认的异常处理行为将启动:停止程序并打印出错误的信息。如果想捕捉异常,就要把代码块放入try语句中,通过try语句捕捉异常并恢复代码的运行。
2、事件通知:异常可用于发出有效的状态的信息,而不需在程序间传递结果标志位。
3、特殊情况处理:代码发生罕见的情况,通常在异常处理器(try语句)中处理这些特殊情况。
4、终止行为:try/finall语句确保无论异常是否发生,执行清理行为
5、非常规控制流程
异常处理
1、默认异常处理器:如果没有使用异常处理器(try语句)捕捉异常,该异常一直会向上传递到程序顶层,并启用默认的异常处理器:就是打印标准出错信息。这些信息包括堆栈跟踪:也就是异常发生时激活的程序行和函数清单。
2、捕获异常:如果不想要默认的异常行为,就需要把代码块包装在try语句,通过try语句捕捉异常,然后由except分局处理异常。
3、引发异常:在代码运行中,我们可以自己引发(抛出)异常。完成这个任务,可以使用raise语句,手动触发异常。assert语句也可以完成相同的任务,其主要用于开发调试。
4、用户定义的异常:通过继承一个内置的异常,用户可以自己定义新的异常。
5、终止行为:无论代码是否发生异常,都必须要执行的的行为(try/finally语句)。例如关闭文件。如果发生异常,没有异常处理器(except语句),将会启动默认异常处理器并打印出标准出错信息。
1、try/except语句
一般格式
1try:
2
3except : #只捕捉特定的异常
4
5except (name2, name3): #捕捉任何列出的异常
6
7except as : #捕捉特定的异常,并获取额外数据(实例)
8
9except (name5, name6),value: #捕捉列出的异常,并获取额外数据(实例)
10
11except : #捕捉所有的异常
12
13[else: #如果没有异常,就运行,设置异常发生标志
14 ]
15finally:
16 ] #无论是否发生异常,都会运行
(1)如果try代码块执行时出现错误,Python就会跳到except分句,搜索第一个和异常名称相符的except子句并执行其下面的语句,即能够处理异常的except子句。当except代码块执行后(没有发生异常),程序就会继续向下执行try语句后的其他语句。
(2)如果try代码块发生异常,没有except语句能够处理引发的异常,异常就会向上传递到try语句前的语句,直至到程序的顶层。即启动默认异常处理器。
(3)如果如果try代码块没发生异常,将执行else语句中的代码块。
2、try/else语句
没有else语句,是无法知道控制流程(没有设置和检查布尔标志)是否已经通过了try语句。因为异常没有发生或者异常发生已经被处理了。
3、try/finally语句
(1)如果try代码块运行时没有异常发生,Python会跳至finally代码块,然后在整个try语句后继续执行。‘
(2)如果try代码块运行时发生异常,Python依然会跳至finally代码块,然后把异常向上传递给默认异常处理器。程序不会在整个try语句后继续执行。
4、统一的try语句和通过嵌套合并finally和except语句
try->except->else->finally
如果出现一个else,至少有一个except语句。
1try:
2 try:
3
4 except name:
5
6 …….
7 else:
8
9finally:
10
5、raise语句
raise语句的组成:raise关键字,后面跟着可选的要引发异常的类或者实例。
1raise #跟类的实例
2raise <class> #跟类对象
3
raise 重新抛出最近引发的异常
raise exception from otherexception 第二个表达式指定了另一个异常类或实例,该类的属性会附加到第一个实例的属性
6、assert 语句
可看做条件式的raise语句,其语句形式是
1assert ,
如果计算为假,Python就会引发异常项
(1)提供类型分类,对今后的修改有更好的支持;
(2)基于类的异常附加了状态信息
(3)基于类的异常支持继承
超类
(1)BaseException:所有内置异常的基超类(顶级根类)。但不能被用户定义的类直接继承。它提供了子类所继承的默认的打印和状态保持行为。如果在这个类的一个实例上调用str内置函数,能够返回创建实例的时候所传递给构造函数__init__参数的显示字符串。实例构造时传递给该类的所有参数都将作为一个元组存储于其args属性中。
(2)Exception:所有内置和非系统退出异常的基超类。BaseException的一个直接子类。除了SystemExit、KeyboardInterrupt和GeneratorExit,它是所有内置异常的超类。所有用户定义的异常将从这个类派生。
(3)ArithmeticError:所有数值错误的类型(Exception的子类)
(4)LookupError:序列和映射的索引错误:是IndexError和KeyError的超类,BaseException的一个子类。
(5)OSError:当系统函数触发一个与系统相关的错误时抛出的异常,包括I/O和文件操作失败。
专用异常
(1)AttributeError:属性引用或赋值失败时抛出的类
(2)EOFError:当input函数靠近文件的尾部时抛出的异常。文件对象读取方法返回一个文件尾部的空对象而不是抛出抛出该异常
(3)GeneratorError:当生成器的close()方法被调用时抛出的异常。BaseException的一个子类
(4)KeyboardInterrupt:用户输入中断时抛出的异常(通常为Ctrl-C)。BaseException的一个子类
(5)IndexError:在超出序列偏移(提取或赋值)限制时抛出的异常
(6)KeyError:当引用不存在的映射键时抛出异常
(7)NameError:查找局部或全局未定义变量名失败时抛出的异常
(8)StopIteration:在迭代对象的数值结尾处抛出的异常
(9)SyntaxError:当遇到语法错误时抛出的异常
(10)SystemExit:调用sys.exit(N)时抛出的异常,BaseException的一个子类
(11)TypeError:当操作或函数用在不恰当类型的对象时抛出异常
(12)ValueError:当内置操作或函数接收一个带有正确类型而值不恰当的参数时抛出的异常。
(13)UnboundLocalError:在引用还没有赋值的局部名称时抛出的异常。NameError的一个子类
(14)ZeroDivisionError:当除或求余运算在右侧运算数为0是抛出的异常。
3、用户定义的异常
用户定义的异常可以定义也可以从其他内置异常继承,通过重新定义构造函数__init__和定义新的方法,可以定制数据和行为,这些数据和行为可以提供异常的细节和异常的方法。
嵌套异常处理器
在嵌套的try/except语句中,当代码执行过程中,发生错误时,Python会回到最近进入的try,然后搜索该try语句下except子句,找到与异常相符的except子句,之后继续在该try语句后继续执行。原因是每个try语句都会留下标识,Python可检查堆栈的标识,从而调回较早的try。
在嵌套的try/finally语句中,当代码发生异常时,每个finally语句都会执行,之后Python会持续把异常向上传递调其他try语句,而最终可能到达顶层默认处理器。
简单的说,异常的传递,基本上就是回到处理先前进入但尚未离开的try语句,只要找到相符的except子句,异常就能够被处理,不会再传递,而通过finally语句就不会。
与异常有关的技巧
1、try语句包装的内容:经常会失败的运算一般都应该包装在try语句内。例如,和系统状态衔接的运算(文件开启)
2、上述规则的例外情况:你希望这类运算失败时会终止你的程序而不是被捕捉或是忽略
3、应该在try/finally中实现终止动作
4、偶尔把函数的调用报装在单个try语句内,而不是让函数本身零散着放入try语句代码块内。
5、处理器的通用性问题。Python可选择那些要捕捉哪些异常,不能太宽,例如except子句会捕捉所有异常;另一方面,处理器也不应该过去具体化。一般的超类就可以,超类可以扩展特定的子类。
写到这里,本期内容讲解完了,不知道读者的你有什么不明白的地方,欢迎各位留言反馈。小编尽最大的努力让理解我所介绍的内容。。
下期准备介绍模块的知识。敬请期待。。。。。。
下面的是我的公众号二维码图片,欢迎关注我。