异常捕获

常见异常类型

Exception:顶级异常类,大部分异常类都是它的子类。
SyntaxError:语法错误
TypeError:类型错误
ValueError:值错误
NameError:找不到名称,比如变量名
IndexError:找不到索引,在序列中取值时出现
KeyError:映射中不存在键名,在字典中取一个不存在的key时出现
ZeroDivisionError:除法中除数为0时出现
FileNotFoundError:找不到文件错误

捕获指定异常

异常捕获的写法结构是try-except,下面模拟一个除数为0的异常。

a = 10
b = 0
try:
result = a / b
print(f"结果是:{result}")
except ZeroDivisionError:
print('除数不能为0')

打印结果:

除数不能为0

我们虽然捕获了ZeroDivisionError,但是也可能出现其他异常,比如a和b不是数字呢?那么我们如果想单独对每一种异常都进行精确捕获与提示的话,可以多写几个except,针对性处理。

a = 10
b = 'abc'
try:
result = a / b
print(f"结果是:{result}")
except ZeroDivisionError:
print('除数不能为0')
except TypeError:
print('类型错误')

打印结果:

类型错误

如果想多个异常统一处理,也可以同时捕获多个异常。

a = 10
b = 'abc'
try:
result = a / b
print(f"结果是:{result}")
except (ZeroDivisionError,TypeError) as e:
print(e)

打印结果:

unsupported operand type(s) for /: 'int' and 'str'

捕获所有异常

捕获所有异常是最省心的做法,你不用去纠结到底这段代码可能会出现哪些异常。

a = 10
b = 'abc'
try:
result = a / b
print(f"结果是:{result}")
except:
print('出现异常了') 打印结果:
出现异常了

主动抛出异常

raise语句对标java和PHP中的throw,作用是抛出异常。

a = 10
b = 0
try:
if b == 0 : raise Exception('竟然是0!')
result = a / b
print(f"结果是:{result}")
except Exception as e:
print(f'出现异常了:{e}')

打印结果:

出现异常了:竟然是0!

raise不仅可以在try-except语句块里面用,也可以在全局使用,在try-except里面抛出异常,会被except捕获,如果在没有try-except代码中使用的话,异常就会向上传递,传给调用方,直到传到主程序全局空间,然后停止程序运行,打印出栈跟踪信息。

未发生异常时

try-except语句还可以包含else代码块,让我们可以像条件判断一样进行异常处理,如果出现异常怎么办,如果没有异常又怎么办。

a = 10
b = 2
try:
if b == 0 : raise Exception('竟然是0!')
result = a / b
print(f"结果是:{result}")
except Exception as e:
print(f'出现异常了:{e}')
else:
print('程序一切正常')

打印结果:

结果是:5.0
程序一切正常

扫尾工作

try-except还有一个finally代码块,无论是否异常都一定会执行finally代码块中的代码,比如打开文件之后做一些业务处理,无论过程是否出现异常,都必须要关闭文件,那么关闭文件的操作就应该放在finally代码块中。

a = 10
b = 0
try:
if b == 0 : raise Exception('竟然是0!')
result = a / b
print(f"结果是:{result}")
except Exception as e:
print(f'出现异常了:{e}')
else:
print('程序一切正常')
finally:
print('扫尾工作清理')

打印结果:

出现异常了:竟然是0!
扫尾工作清理

自定义异常

自定义异常类需要继承Exception类,直接继承或间接继承都可以。

class MyError(Exception):
pass try:
raise MyError('随便抛')
except MyError as e:
print(f'捕获到了自定义异常:{e}')

打印结果:

捕获到了自定义异常:随便抛

如果你愿意,也可以在自定义异常类中覆盖父类的构造函数,或者添加方法都可以。

Python基础-异常的更多相关文章

  1. python基础-异常(exception)处理

    python基础-异常(exception)处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 程序中难免出现错误,而错误分成两种,即语法错误和逻辑错误.语法错误根本过不了pyth ...

  2. python基础--异常,对象和迭代器

    异常处理 面向对象 迭代器和生成器 python异常处理 下面代码触发了一个FileNotFoundError >>> open("notexist.txt") ...

  3. python基础-----异常问题

    ---恢复内容开始--- 当发生python不知所措的错误时,python会创建一个异常对象, 如果你编写处理该异常的代码,程序将会继续运行: 如果你未对异常做任何处理,程序将会停止,并显示一个tra ...

  4. python基础-异常和模块

    异常的定义 #encoding=utf-8 import sys try: 1/0 print "never executed!" except ZeroDivisionError ...

  5. Python基础——异常

    捕捉所有异常 for i in range(10): try: input_number=input('write a number') if input_number=='q': break res ...

  6. 【原】Python基础-异常

    def cacls(x, y): try: return x/y except ZeroDivisionError: print("y can not be zerp") exce ...

  7. Python基础学习笔记(十三)异常

    参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-exceptions.html Python用异常对象(excep ...

  8. Python基础+模块、异常

    date:2018414+2018415 day1+2 一.python基础 #coding=utf-8 #注释 #算数运算 +(加)  -(减)  *(乘)  /(除)  //(取整)  %(取余) ...

  9. 十九. Python基础(19)--异常

    十九. Python基础(19)--异常 1 ● 捕获异常 if VS异常处理: if是预防异常出现, 异常处理是处理异常出现 异常处理一般格式: try:     <............. ...

随机推荐

  1. Java并发编程的本质是解决这三大问题

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 前言 并发编程的 ...

  2. Redis持久性——RDB和AOF

    Redis持久性 Redis提供了不同的持久性选项: RDB持久性以指定的时间间隔执行数据集的时间点快照. AOF持久性记录服务器接收的每个写入操作,将在服务器启动时再次播放,重建原始数据集.使用与R ...

  3. 马士兵老师Java虚拟机调优

    该视频主要讲解的内容如下所示: 1.虚拟机的内存结构 1.每一个线程都有一个虚拟机栈,线程中每调用一个方法都会开启一个栈帧,栈帧里面保存方法中的局部变量. 2.方法区在java8以后改名为永久区域pe ...

  4. 如何在一个HTML文件中嵌套另一个HTML文件并且可以进行切换HTML文件

    使用iframe 要点:a标签+iframe A标签的target属性 iframe 的id与name属性 示例: <!DOCTYPE html> <html> <hea ...

  5. React-Native WebView使用本地js,css渲染html

    前言 最近在使用React-Native开发一个App,遇见一个问题,Webview组件根据url来加载页面,但是这样导致的一个问题页面加载的时间有点长,我想优化一下,因为页面只要是一些内容展示,我想 ...

  6. 简单的Linq查询语句

    下面我来我大家介绍几种简单的查询方式. 1.简单语法 这个LINQ语句的第一个关键字是from,from后面加的是范围变量,范围变量后加in,后加上事先实例化的模型,然后点出数据的来源. List是列 ...

  7. JavaScript基础有关构造函数、new关键字和this关键字(009)

    1. 总是记得用new关键字来执行构造函数.前面提到,可以用构造函数创建JavaScript的对象,这个构造函数在使用的时候需要使用new关键字,但如果忘记写入new关键字,会怎么样?事实上这个函数还 ...

  8. Spring 获取单例流程(三)

    读完这篇文章你将会收获到 Spring 何时将 bean 加入到第三级缓存和第一级缓存中 Spring 何时回调各种 Aware 接口.BeanPostProcessor .InitializingB ...

  9. Nginx 从入门到放弃(一)

    Nginx nginx的使用场景 静态资源服务 通过本地文件系统提供服务 反向代理服务 nginx的强大性能 缓存 负载均衡 API服务 OpenResty nginx优点 高并发.高性能 可扩展性好 ...

  10. 一.前后端分离及drf实现序列化的原理

     为什么要进行前后端分离 可pc.app.pad多端适应 SPA开发模式的流行--单页web应用(只有一html页面) 可实现前后端开发职责清(不分离时,前端是通过后端给的变量并渲染出来方式拿到数据! ...