当前位置: 首页 > news >正文

python学习笔记(八):异常处理

一、异常处理

在程序运行过程中,总会遇到各种各样的错误。程序一出错就停止运行了,那我们不能让程序停止运行吧,这时候就需要捕捉异常了,通过捕捉到的异常,我们再去做对应的处理。

下面我们先写一个函数,实现除法运算。

def calc(a,b):
 
    return a/b
 
print(calc(5,1))#调用,没有错误,结果是5.0
 
>>> 5.0
 
print(calc(5,0))#再次调用,这时候就不对了,因为被除数不能为0,下面报了一堆错,程序停止运行了
 
>>> ZeroDivisionError: division by zero

这个时候我们就需要捕捉异常了,如果除数是0的话,就提示用户传入的参数不对,重新传入。

捕捉异常使用try....except....关键字,就是你在写代码的时候,先要考虑到这段代码可能会出现什么样的错误,然后做对应的处理,try里面就是包含你做处理的代码,except里面就是出了某种错误的时候,我怎么去处理,下面我们改下代码,捕捉异常。

def calc(a,b):
 
   try:
 
       res = a/b
 
   except ZeroDivisionError as e:#如果是除数为0的错误,就返回除数不能为0,这个as e代表把返回错误的信息赋给e
 
       return '除数不能为0!'
 
   return res#这个是如果没有这个异常的话,就返回结果
 
print(calc(5,0))#这样再调用就不会出来错误了,就返回除数不能为0这个了。
 

上面就是捕捉异常,当然上面的只能捕捉到除数为0的错误,如果有别的错误就捕捉不到了;还有一个finally的用法,就是不管出不出异常都执行;try还有一个可以捕捉所有异常,还有else的用法,就是没出异常的时候怎么办,下面用代码来解释。

def calc(a, b):
    try:  # 捕捉异常
        res = a / b
    except ZeroDivisionError as e:
        return '除数不能为0!'
    except KeyError as e:  # 捕捉KeyError这个异常,当然这段代码没用到字典,所以不会有keyerror这个错误,我只是举个例子
        return 'keyerror错误'
    except Exception as e:  # 这个是捕捉所有的异常,不管你有什么异常都可以捕捉到
        print('其他异常')
        return e  #返回错误信息
    else:  #这个else和上面的try对应的,也就是不出异常的话走这里
        print('没有出异常')
        return res
    finally:  #这个finally是不管这个段代码有没有出异常都走它
        print('出没出异常都走我这里')
 
print(calc(5, 0))  #出除数异常了,会返回除数不能为0!和执行finally里面的代码
 
print(calc(5, 1))  #这个没有出异常,就会走else里面的东西,返回结果,也会执行执行finally里面的代码
 
print(calc(5, 's'))  #这个也走异常了,除数是字符串,肯定不能除,就走那个捕捉所有异常的代码了,也会执行执行finally里面的代码

二、常见的一些异常信息:

 
AttributeError: 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
 
IOError:输入/输出异常,一般是无法打开文件
 
ImportError: 无法导入模块或包,一般是路径问题或名称错误
 
IndentationError:代码没有正确对齐,属于语法错误
 
IndexError:下标索引超出序列边界,比如x只有三个元素,却试图访问x[3]
 
KeyError:试图访问字典里不存在的键
 
KeyboardInterrupt:Ctrl+C被按下
 
NameError:使用一个还未被赋予对象的变量
 
SyntaxError: 语法错误
 
TypeError: 传入对象类型与要求的不符
 
UnboundLocalError:试图访问一个还未被设置的局部变量,一般是由于在代码块外部还有另一个同名变量
 
ValueError: 传入一个调用者不期望的值,即使值的类型是正确的

三、主动抛出异常

主动抛出异常,就是我们在代码里面让它自动抛出一个异常,然后捕捉到,比如说我们在写自动化测试脚本的时候,结果和预期不符合,就可以主动抛出一个异常信息,然后捕捉到,做其他的处理,主动抛出异常使用raise关键字。

try:
 
    raise KeyError#主动抛出一个keyerror的异常
 
except KeyError as e:
 
    print('这个是我主动抛出的异常')
 

 

转载于:https://www.cnblogs.com/hanzhao1987/p/8215486.html

相关文章:

  • python中package机制的两种实现方式
  • 2017年年度总结
  • 原来Intel CPU漏洞是它引起的!
  • 在全是无人车的世界里,过马路是种怎样的体验?
  • DeepMind新论文:基于变分方法的自编码生成对抗网络
  • document.getElementByName() 获取值得问题
  • Python3虚拟环境--venv
  • 管理控制文件 和日志文件
  • Fedora 全局代理上网设置
  • Eclipse Tomcat启动后乱码
  • 设置IntelliJ主题和字体方法
  • 相机频率 条纹图片颜色还原不精确的问题,特别是指图片颜色过渡不自然的现象...
  • Git学习-Git时光机之版本回退(二)
  • linux 资料
  • 前后端分离实践
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [译]Python中的类属性与实例属性的区别
  • github从入门到放弃(1)
  • Git的一些常用操作
  • Hibernate【inverse和cascade属性】知识要点
  • java中具有继承关系的类及其对象初始化顺序
  • mysql中InnoDB引擎中页的概念
  • Vue学习第二天
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 复杂数据处理
  • 关于Flux,Vuex,Redux的思考
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • gunicorn工作原理
  • Python 之网络式编程
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​queue --- 一个同步的队列类​
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • $$$$GB2312-80区位编码表$$$$
  • (11)MATLAB PCA+SVM 人脸识别
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (C++17) optional的使用
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (zt)最盛行的警世狂言(爆笑)
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (算法二)滑动窗口
  • (转)可以带来幸福的一本书
  • 、写入Shellcode到注册表上线
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET开发人员必知的八个网站
  • .Net语言中的StringBuilder:入门到精通
  • ::什么意思
  • :“Failed to access IIS metabase”解决方法
  • @EventListener注解使用说明
  • [@Controller]4 详解@ModelAttribute
  • [1127]图形打印 sdutOJ