导读: 程序员每天遇到bug就像喝水吃饭一样稀松平常,关键在于怎么高效而不失优雅的面对这些bug!所以,你还在固执的使用try……except吗?

为了提高程序运行的稳健性,几乎所有语言都提供了try……except……用法,Python也不例外。虽然try……except……语法能够确保程序能够跳过异常代码片段,无论如何都继续执行下去,但有时主动的触发报错和异常也是一种行之有效的程序员装X护体方法。

本文主要介绍Python中的两个异常相关的关键字:assert和raise,前者用于断言发现潜在异常,后者用于触发报错,实际上二者功能有很大相近之处。

01 Python异常分类

Python内置了数十种Exception/Error类型,例如常见的如下几种:IndexError,索引错误,例如引用了超出列表长度的索引

KeyError,键值错误,例如引用了字典中不存在的键值

NameError,未声明错误,例如引用了未赋值的对象或变量

SyntaxError,语法错误,广泛存在

IndentationError,缩进错误,这是Python摒弃花括号而用缩进区分代码段的特色产物

TypeError,类型错误,例如执行数字和字符串相加会引发此类错误

这些错误很常见,也比较直观易懂。但有没有考虑过主动触发这些错误呢?

02 assert:断言

assert一般用于函数和类的内部,在执行具体逻辑前首先对输入参数和程序执行状态进行一定的检查和预判,仅当执行状态满足时才继续执行后续的逻辑,否则断言条件不满足,引发后续的提示。

assert关键字基本用法为:1assert "条件判断", "条件不满足时输出的提示信息"

例如,设计一个两数相除的函数,那么应当在执行相除前检查:两个输入参数是否为数值型

除数是否不为0

这一条件判断可用assert完成,并在条件不满足时优雅的提示报错:

1 def div(x, y):

2 assert isinstance(x, (float, int)) and isinstance(y, (float, int)), \

3 "param `x` and `y` expected to be 'int' or 'float' type"

4 assert y != 0, "param `y` should not to be exactly `0`"

5 return x/y

6

7div(1, "2")

8---------------------------------------------------------------------------

9AssertionError Traceback (most recent call last)

10 in

11----> 1 div(1, "2")

12

13 in div(x, y)

14 1 def div(x, y):

15 2 assert isinstance(x, (float, int)) and isinstance(y, (float, int)), \

16----> 3 "param `x` and `y` expected to be 'int' or 'float' type"

17 4 assert y != 0, "param `y` should not to be exactly `0`"

18 5 return x/y

19

20AssertionError: param `x` and `y` expected to be 'int' or 'float' type

由于输入参数y是字符串类型,断言失败,引发断言错误

相较于try……except……用法,assert的最大意义在于能够及时发现程序中未按预期状态执行的错误,这在多人协作coding过程中,比except更能提供丰富的报错信息。

03 raise:触发异常

实际上,raise关键字的哲学与assert是有相通之处的,只不过assert包含逻辑判断和触发提示信息两部分内容,而raise则只用于手动触发异常,且一般触发的是Python内置异常类型。某种程度上,raise的灵活性要比assert低,在个人实际使用过程中也几乎很少用到。

raise关键字基本语法为:

raise 异常类名称(描述信息)

例如,仍以实现上述div函数功能为例,以raise关键字执行同样的断言功能,则可如下实现:

1def div(x, y):

2 if not isinstance(x, (float, int)) or not isinstance(y, (float, int)):

3 raise TypeError("param `x` and `y` expected to be 'int' or 'float' type")

4 if y == 0:

5 raise ZeroDivisionError("param `y` should not to be exactly `0`")

6 return x/y

7

8div(1, 0)

9---------------------------------------------------------------------------

10ZeroDivisionError Traceback (most recent call last)

11 in

12----> 1 div(1, 0)

13

14 in div(x, y)

15 3 raise TypeError("param `x` and `y` expected to be 'int' or 'float' type")

16 4 if y == 0:

17----> 5 raise ZeroDivisionError("param `y` should not to be exactly `0`")

18 6 return x/y

19

20ZeroDivisionError: param `y` should not to be exactly `0`

由于除数为0,raise关键字触发异常

以上就是Python中这两个关键字的简单用法,单论其实质功能而言都称不上是不可或缺,甚至可能会觉得有些鸡肋,但不得不说在某些场景下二者其实都还是有用武之地,或许届时你的代码也可以如大佬一般:优雅高效,同时略显装__!

相关阅读:

c4d python技巧_还在Bug不断?不妨试试Python中的这2个装__技巧相关推荐

  1. python工作技巧_能让你工作事半功倍的python小技巧大合集

    导读:Python是目前世界上最流行的编程语言之一.因为: 1. 它容易学习 2. 它用途超广 3. 它有非常多的开源支持(大量的模块和库) 本文作者 Peter Gleeson 是一名数据科学家,日 ...

  2. 什么专业的会学python语言_还在纠结学什么编程语言吗?Python可能会“教”你做人...

    这几年为什么Python在中国就火起来了? Python这个东西国,大概是从2017年末开始,突然就火了起来的.此前,对于Python,乃至编程,绝大多数程度上都是专业人士的话题,在普通大众层面上起不 ...

  3. 1688学python学不会_还在害怕学不会Python嘛?这篇文章让你瞬间读懂Python入门!...

    零基础学习Python能学会吗?这个问题几乎是所有初学Python的小白都会问到的问题.其实Python是非常适合初学者入门的,相较于其他主流类编程语言,Python具有更好的可读性,因此上手更容易, ...

  4. python 快速排序_小白入门知识详解:Python实现快速排序的方法(含实例代码)...

    前言: 今天为大家带来的内容是:小白入门知识详解:Python实现快速排序的方法(含实例代码)希望通过本文的内容能够对各位有所帮助,喜欢的话记得点赞转发收藏不迷路哦!!! 提示: 这篇文章主要介绍了P ...

  5. python人工智能_人工智能人才缺口千万!学Python抓住风口机会

    前不久教育界的一个消息,引发了广泛的关注. 今年9月,浙江三到九年级信息技术课将替换新教材,八年级将新增Python课程内容.新高一信息技术编程语言由VB替换为Python,大数据.人工智能.程序设计 ...

  6. 结巴分词python安装_“结巴”分词:做最好的Python分词组件

    python 结巴分词学习 https://www.toutiao.com/a6643201326710784520/ 2019-01-06 10:14:00 结巴分词(自然语言处理之中文分词器) j ...

  7. 初学者不建议月python吗_为什么我不建议你将python作为入门编程语言

    现在流行的编程语言里,python的热度可谓是热的通红,python以其短小精悍的语法.以其高效的开发,简单入门作为亮点,迅速的在各个领域占有一席之地. 然而,无论你说python有多好,我都不建议你 ...

  8. python人才_【北软互联】上海python人才外派|上海python程序员人力外包|上海python工程师开发驻场|上海python软件劳务派遣公司...

    python人才简述 python是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此python语言具有功能强大和简单易用两个特征.python ...

  9. python 脑洞_从说韩语到写Python,这个数据媛的脑洞有毒吧

    你好,Hello,안녕하세요, こんにちは,我是会说四门语言,但是日语可以忽略,韩语也差不多已经忘记,转而写R和Python的语言学迷妹聂大哥. 我要说的脑洞有毒的数据媛就是我计己,哈哈.正式入坑数据 ...

  10. 如何将c语言程序封装供python调用_转:用C语言扩展Python的功能

    一.简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型 ...

最新文章

  1. thrift的中文编码处理
  2. mysql-5.7.17-winx64的安装配置
  3. github是什么?
  4. 从淘特升级,看电商特别模式的特别价值
  5. 镜像镜像–使用反射在运行时查看JVM内部
  6. php-fpm哪里下载_如何在centos系统下找到php-fpm的位置 - 翟码农技术博客
  7. php火的原因,重燃你的PHP安全之火
  8. Perceptual:英特尔感知计算挑战赛 正式启动
  9. 【jQuery笔记Part1】08-jQuery操作css-获取设置样式
  10. 关于代码审查,那些你不曾关注的细节
  11. Lesson 05 for Plotting in R for Biologists
  12. Linux -- 特殊权限 (转)
  13. [CS131] Lecture 1 Course Introduction
  14. 希捷服务器硬盘15k有几代,1.5万转 希捷15K.7系列600G硬盘首测
  15. ”骇客“不可缺少的电脑软件
  16. PowerBI-时间智能函数-SAMEPERIODLASTYEAR
  17. 计算机页面里的坚果云删不了怎么回事,坚果云如何卸载?卸载坚果云的几种方法...
  18. acwing280.陪审团 01背包
  19. python中文聊天_Python下两种曲线救国实现AIML中文聊天机器人功能的方法
  20. 【项目实战开发】第三章——在线生鲜商城系统

热门文章

  1. 一些压力测试结果(Mysql,Zookeeper,Redis,Mongodb)
  2. 王通:网络营销人才必备的10种技能
  3. zz java compare 接口
  4. Java中,类的实例化方法
  5. laravel input值必须不等于0_【第十一期】实现 Javascript 版本的 Laravel 风格参数验证器...
  6. springboot - 整合多数据源配置
  7. Storm BaseBasicBolt和BaseRichBolt
  8. mybatis的一级缓存和二级缓存的理解,详细易懂
  9. php pdo exec,PDO::exec
  10. c语言中函数的递归调用,用C语言函数调用与递归解决问题