Hello,今天天小编和大家带来的是python的异常处理。
在python里我们难免会有容易发生异常的代码块,那么遇到这些代码块我们该怎么处理呢?
首先,异常是什么?
异常是程序执行过程中出现问题导致程序无法执行。
一般情况下,在Python无法正常处理程序时就会发生一个异常。
异常是Python对象,表示一个错误。
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
分类
异常的分类一共分两种,第一种是程序在逻辑上的错误或算法上的错误,第二种是运行过程中计算机的失误,例如oi,内存发生异常。
那遇到这些异常我们一般需要做什么呢?
首先第一件要做的事情就是保持镇定,不要惊慌!!!!
其次就是静下心来看报的异常是什么,如果能看懂是什么异常就自己去解决异常,如果看不懂就去百度这个异常,查找解决方法。
那一般的,对于异常它是怎么产生的呢?
异常之所以能够产生则是因为解释器读取指令的时候发现有问题,不能继续执行下去了,它便会抛出一个异常。
那对于异常系统的解释器又如何去处理呢?
如果使用了try-except块就能去处理异常,采用raise来甩出一个异常,当然对于一些其他的异常系统也会去选择忽略有或者是终止当前程序去处理异常。
那这边我们就来看一个简单的异常:
这是一行简单的异常,我们来看看程序报什么错:
异常说:hello这个变量没有被定义
那如何解决这个异常呢???
答案就是定义这个hello,把它变成一个标识符或者字符串都可以解决报错,在python里面变量不能被直接声明,都需要通过间接赋值来声明变量的。所以如果想把hello变成标识符就只能对他进行赋值例如:hello=“helloworld”,如果需要将它变成字符串就可以直接用引号引起来“hello”即可。
那下面我们来看看都有什么异常吧!
AttributeError
试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
IOError(FileNotFounderror)
输入/输出异常;基本上是无法打开文件
ImportError
无法引入模块或包;基本上是路径问题或名称错误
IndentationError
语法错误(的子类) ;代码没有正确对齐
IndexError
下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError
试图访问字典里不存在的键
KeyboardInterrupt
Ctrl+C被按下
NameError
尝试访问一个没有申明的变量
(第一个hello的例子就是NameError)
SyntaxError
表示语法错误,一般是代码出现错误才会报SyntaxError错误
TypeError
传入对象类型与要求的不符合
UnboundLocalError
试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
UnboundLocalError: local variable 'l' referenced before assignment
- 内部函数,不修改全局变量可以访问全局变量
- 内部函数,修改同名全局变量,则python会认为它是一个局部变量
- 在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbound-LocalError
正常:
报错:
等等........
异常处理的定义
python解释器检测到错误,触发异常(也允许程序员自己触发异常)
程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)
如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理。
异常处理的意义
python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性 。
那么下面重点来了,如何处理异常?
捕捉异常可以使用try/except语句。
try/except语句用来检测try语句块中的错误,
从而让except语句捕获异常信息并处理。
如果不想在异常发生时结束你的程序,在try里捕获它即可。
try-except代码块:
try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
如果你不会,只想简单的捕获可能发生的异常,你可以:
(不需要加任何参数)
try: 正常的操作 ..................... except: 发生异常,执行这块代码 ..................... else: 如果没有异常执行这块代码
那如果需要带参数呢?
你可以通过except语句来捕获异常的参数,如下所示:
try: 正常的操作 ...................... except ExceptionType, Argument: 你可以在这输出 Argument 的值...
除了以上的异常捕获之外,我们还可以强行甩出一个异常:
关键字raise
raise语法格式如下:
raise [Exception [, args [, traceback]]]
例如:
def functionName( level ): if level < 1: raise Exception("Invalid level!", level) # 触发异常后,后面的代码就不会再执行
那最后我们还可以自定义异常!
通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类,通过直接或间接的方式。
以下为与RuntimeError相关的实例,实例中创建了一个类,基类为RuntimeError,用于在异常触发时输出更多的信息。
在try语句块中,用户自定义的异常后执行except块语句,变量 e 是用于创建Networkerror类的实例。
class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg
在你定义以上类后,你可以触发该异常,如下所示:
try: raise Networkerror("Bad hostname")except Networkerror,e: print e.args
今天就到这里吧!