今天学习的是python中的异常处理,所以简单的整理下学习的知识点。
还是照旧,先了解下概念,什么是异常处理呢?
我听到这个概念时,脑海里第一个出现的就是错误,异常不就是进程出现错误,导致无法运行,所以才显示异常。
你们呢?那到底什么是异常呢?
异常指的是软件在运行的过程中,因为一些原因(如:使用者操作不当等),引起程序错误,导致软件奔溃的这种现象,就叫做异常
我们一般遇见异常怎么办呢?那就是勇敢的面对它,奥里给!因为异常不解决,我们就无法正常的运行我们的程序,所以为了面包,为了房子,我们得解决异常,是我们的代码程序可以继续正常运行。同时,处理异常可以帮助提高软件容错性。
那我们如何解决异常呢?接下来说说如何解决异常。
处理异常
我们可以通过使用 try..except 来处理异常状况。一般来说我们会把通常的语句放在 try 代码块中,将我们的错误处理器代码放置在 except 代码块中。
try ... catch语句块来完成,使用try抓捕异常。
try:
# 将有可能触发异常的代码except:
print("处理异常")
那到底是如何处理的呢?
我们将所有可能引发异常或错误的语句放在 try 代码块中,并将相应的错误或异常的处理器(Handler)放在 except 子句或代码块中。except 子句可以处理某种特定的错误或异常,或者是一个在括号中列出的错误或异常。如果没有提供错误或异常的名称,它将处理所有错误与异常。
要注意到必须至少有一句 except 字句与每一句 try 字句相关联。不然,有一个 try 代码块又有什么意义?
如果没有任何错误或异常被处理,那么将调用 Python 默认处理器,它只会终端程序执行并打印出错误信息。
我们还可以拥有一个 else 子句与 try..except 代码块相关联。else 子句将在没有发生异常的时候执行。
常见异常
异常名称 | 异常描述 |
---|---|
ValueError | 传入无效的参数 |
KeyError | 映射中没有这个键 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点数计算错误 |
IndexError | 序列中没有此索引(index) |
SyntaxError | Python 语法错误 |
ImportError | 导入模块/对象失败 |
UserWarning | 用户代码生成的警告 |
异常的继承关系
BaseException
|
Exception
|
异常的处理流程
先说下try.....except语法
try:
<语句> #运行别的代码
except<名字>:
<语句> #如果在try部分引发了‘name’异常
except<名字>:,<数据>:
<语句> #如果引发了‘name’异常,获得附加的数据
else:
<语句> #如果没有异常发生
try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
|——如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
|——如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印默认的出错信息)。
|——如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
try:
# 将有可能触发异常的代码except Xxx as e:
print("处理Xxx异常")
except Xxxx as e:
print("处理Xxxx异常")
except Exception as e:
print("使用多态将其他异常一网打尽")# 在python中,很多块级作用域,都有这个else
else:
print("没有出现异常时执行的代码")
多个异常的处理方式
try:
passexcept KeyboardInterrupt:
pass
except BlockingIOError:
pass
except EOFError:
pass
except Exception:# 第二种多个异常处理的写法(不推荐,认识就可以了)
try:
pass
except (KeyboardInterrupt, KeyError, ValueError, EnvironmentError) as e:
print("出现了异常")
finally关键字和自定义异常
try:
# 有可能出现异常的代码
except Xxx:
print("处理异常")
...
else:
print("没有异常时执行的")
finally:
# 表示最后要执行的代码
# 必须要执行的代码
# 不管有没有异常出现,必须要执行的
# 一般会将必须要执行的代码,如资源的释放,链接的是关闭等等
函数中:如果在return后面存在finally,那么代码并不会直接返回,而是需要先执行
finally代码,之后才会返回
自定义异常
通过创建一个新的异常类,程序可以命名它们自己的异常。
异常应该是典型的继承自Exception类,通过直接或间接的方式。
首先需要定义一个类,之后让这个类继承Exception\BaseException,当然建议使用Exception类
人为的抛出异常:
raise关键字
作用:提示错误,向上层传递错误信息
简单举例说明下
首先我们先定义一个类
class networkerro(runningerror)
def__init__(self,arg):
self.args = arg
我们定义完类后,便可以触发该异常
try: raise networkerror("Bad hostname") except networkerror,e: print e.args
好了,今天的分享就到这里了,其实学习的道路是充满了困难,但是面对困难的最好方法,就是勇敢的面对困难。
希望自己也可以学有所成,有所作为!
加油,奥里给!