异常捕获

常见异常类型

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. Spring中的AOP(二)

    2.5 Spring的织入 在上一篇文章中,我们介绍了Pointcut.Advice.Advisor三个必要模块,剩下的工作就是把它们拼装起来,也就是织入过程.在Spring中,使用类org.spri ...

  2. 【asp.net core 系列】14 .net core 中的IOC

    0.前言 通过前面几篇,我们了解到了如何实现项目的基本架构:数据源.路由设置.加密以及身份验证.那么在实现的时候,我们还会遇到这样的一个问题:当我们业务类和数据源越来越多的时候,我们无法通过普通的构造 ...

  3. 为什么 group by后面 必须跟selecte 后面的除了聚集函数外的所有字段

    如:SELECT store_name, SUM(Sales) FROM Store_Information GROUP BY store_name 可以而SELECT store_name, add ...

  4. valueOf()、toString()

    基本上,所有JS数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题. JavaScript 的 valueOf() 方法 valu ...

  5. CSS中那些必须掌握的概念

    一.盒子模型 1.什么是盒子模型 css盒模型本质上是一个盒子,封装周围的html元素,它包括:外边距(margin).边框(border).内边距(padding).实际内容(content)四个属 ...

  6. Write a program to copy its input to its output, replacing each string of one or more blanks by a single blank.

    #include <stdio.h> void main() { int c,c_BCN; while((c=getchar())!=EOF) { if(c!=' ') c_BCN=; i ...

  7. ORA-04063: package body "DBSNMP.BSLN" has errors

    ORA-04063: package body "DBSNMP.BSLN" has errors 问题描述: 警告日志出现报错: Sun Jun 28 00:00:01 2020 ...

  8. 手写一个Redux,深入理解其原理

    Redux可是一个大名鼎鼎的库,很多地方都在用,我也用了几年了,今天这篇文章就是自己来实现一个Redux,以便于深入理解他的原理.我们还是老套路,从基本的用法入手,然后自己实现一个Redux来替代源码 ...

  9. css实现1px 像素线条_解决移动端1px线条的显示方式

    使用CSS 绘制出 1px 的边框,在移动端上渲染的效果会出现不同,部分手机发现1px 线条变胖了,这篇文章整理2种方式实现1px 像素线条. 1.利用box-shadow + transform & ...

  10. Blazor带我重玩前端(二)

    概览 Blazor目前有两种托管模式,一种是Server-Side模式,一种是WebAssembly模式.官方首先支持的是Service-Side模式,使用WebAssembly模式,需要更新到最新版 ...