30天学习Python 第十四天——错误处理

错误处理

没有程序是完美的,除非是一个精心编写的hello world程序 ????。

今天我要探讨的是Python中错误处理的全部内容,我尽量用平实简单的话来解释。错误处理可能是程序中最重要的概念了。

所有的应用都可能出现bug或者异常,错误是难免的。当程序由于某种未知的原因运行或执行失败时,错误通常会传递有用的信息。这可能是一个偶然的捆绑错误,可能是应用程序离线却试图访问互联网。可能是计算错误或者程序运行导致内存溢出。在我们写程序时,有很多可能出现错误。当错误发生时,程序就会停止运行,这不是我们所想要的。与其期望程序运行没有错误,更好更实用的做法是捕获错误并进行相应的处理。

在Python中,错误大致可能分为两类 —— 语法错误(Syntax Errors)和程序异常(Exceptions)。

当我们写的Python代码编译器无法确定是正确的(符合规则)代码时,就会出现语法错误。print('A grave mistake) # 少了一个引号,会出现语法错误复制代码def hello # 少了 :, 会出现语法错误

print('hello')复制代码

无论何时程序运行出现了语法错误,Python编译器都能够给出关于是哪一行代码造成了错误的详细信息。

有意义的是一些其他的错误会导致另一部分的语法错误。

我们的程序经常要接受外部的值,并且计算的执行要依赖于这些值。但这些值可能经常是不正确的。在这种情况下,就会出现错误。因此,它们需要被处理。age = input('Enter your age')if age > 18:

print('You are an adult')else:

print('You are a minor')复制代码

运行这段简单的代码会出现异常Traceback (most recent call last):

File "main.py", line 2, in if age > 18:

TypeError: '>' not supported between instances of 'str' and 'int'复制代码

这个异常是一个类型错误,因为age的值是一个字符串,所以编译器阻止了程序的运行,age需要类型转换或者转换为一个数值。age = int(input('Enter your age'))if age > 18:

print('You are an adult')else:

print('You are a minor')复制代码

现在,如果用户给的是一个字符串而不是一个数值,将会抛出另一个异常Enter your age asdf

Traceback (most recent call last):

File "main.py", line 1, in

age = int(input('Enter your age'))

ValueError: invalid literal for int() with base 10: 'asdf'复制代码

Try except语句块

为了阻止类似的错误,Python提供了try``except语句块,如果try语句块中捕获到了一个错误,将会执行except代码块。

作为对比,JavaScript中,使用的是try``catch语句块。Python只是catch的名字不一样,但功能是相似的。try:

age = int(input('Enter your age'))  if age > 18:

print('You are an adult')  else:

print('You are a minor')except:

print('Invalid value provided')复制代码

Else语句块

除了try except语句块,Python还提供了else,如果在try``except语句块没有捕获到异常的时候就执行else语句块中。这是try except语句的扩展。try:

age = int(input('Enter your age'))  if age > 18:

print('You are an adult')  else:

print('You are a minor')except:

print('Invalid value provided')else:

print('Thank You!')复制代码

Finally语句块

在程序开发中经常我们会想无论是否有异常都会执行一个动作。比如说向服务器发送日志信息。Python提供了finally块作为try except块的一部分,无论是否有异常都会执行它。try:

age = int(input('Enter your age'))  if age > 18:

print('You are an adult')  else:

print('You are a minor')except:

print('Invalid value provided')finally:

print('Sendiing dummy log to server') # 总是会被打印复制代码

内置异常

Python提供了许多内置的异常,它们都继承自BaseException 类

这些异常类能够用于处理特殊的异常,比如TypeError, ValueError, SystemError等from functools import reducedef calc_average(number_list):

'''

接受一个列表并且返回平均值

'''

sum = reduce(lambda acc, curr: acc + curr, number_list)

average = sum/len(number_list)  return average

print(calc_average([1,2,3,4,5])) # 3.0# 传入非法参数时将会报错print(calc_average(['1','2','3','4','5'])) # TypeErrorprint(calc_average(None)) # TypeErrorprint(calc_average(3/0)) # ZeroDivisionError复制代码

为了使函数更加可靠,我们可以捕获异常from functools import reducedef calc_average(number_list):

'''

接受一个列表并且返回平均值

'''

try:sum = reduce(lambda acc, curr: acc + curr, number_list)

average = sum/len(number_list)return average  except TypeError:

print('Only a list of numbers is valid')

print(calc_average('hello world')) # 输出:Only a list of numbers is valid复制代码

上面的代码捕获了非法参数。但是代码逻辑本身可能存在缺陷,可以使用单独的except块处理。from functools import reducedef calc_average(number_list):

'''

接受一个列表并且返回平均值

'''

try:sum = reduce(lambda acc, curr: acc + curr, number_list)

average = sum/len(number_list)1.0/0 # Bugreturn average  except TypeError:

print('Only a list of numbers is valid')  except ZeroDivisionError:

print('cannot divide by zero')

print(calc_average([1,2,3,4,5])) # cannot divide by zero'复制代码

多个异常也能够在一条语句中被同时捕获from functools import reducedef calc_average(number_list):

'''

接受一个列表并且返回平均值

'''

try:sum = reduce(lambda acc, curr: acc + curr, number_list)

average = sum/len(number_list)return average  except (TypeError, ZeroDivisionError): # 处理多种情况print('Only a list of numbers is valid')

print(calc_average(['asdfasdf'])) # Only a list of numbers is valid复制代码

上面的代码处理可能的异常,但是隐藏了编译器提供的有用堆栈错误,这些信息能够告诉我们错误是哪一行代码造成的。

实际的错误消息和自定义的错误消息可以组合在一起。from functools import reducedef calc_average(number_list):

'''

接受一个列表并且返回平均值

'''

try:sum = reduce(lambda acc, curr: acc + curr, number_list)

average = sum/len(number_list)return average  except TypeError as type_error:

print(f'Only a list of numbers is valid {type_error}')  except ZeroDivisionError as zero_div_error:

print(f'cannot divide by zero {zero_div_error}')

print(calc_average('hello world'))

# Only a list of numbers is valid unsupported operand type(s) for /: 'str' and 'int'复制代码

这能使错误信息更有用。在Pytho中使用raise关键字也可以根据某些条件引发自定义错误name = input('Enter your name')if name.lower() == 'god':  raise('Name cannot be GOD!')else:

print(name)复制代码

记住Python中所有的内置错误处理类是不可能的,除非你是专家!

Python内置异常文档可以作为处理所需异常的参考。

python里面的报错语句翻译_(翻译)30天学习Python相关推荐

  1. python打开文件报错无效序列_解决Python 写文件报错TypeError的问题

    处理上传的文件: f1 = request.FILES['pic'] fname = '%s/%s' % (settings.MEDIA_ROOT, f1.name) with open(fname, ...

  2. python运行启动报错解决方法_解决python运行启动报错问题

    解决python运行启动报错问题 问题一: python启动报错api-ms-win-crt-process-l1-1-0.dll丢失 解决: 下载api-ms-win-crt-process-l1- ...

  3. python def函数报错详解_【python】详解python函数定义 def()与参数args、可变参数*args、关键参数**args使用实例...

    Python内置了很多函数,可以直接调用.Python内置的函数可以通过官方文档查看.也可以通过help()查看帮助信息.函数名是指向函数对象的引用,把函数名赋给变量,相当于给函数起了别名. 1. 定 ...

  4. python打开文件报错无效序列_黑马python入门(4):python基础(序列,异常,操作文件,模块包,日志调试信息)

    序列 str声明:test_str="abcedf" 也可以保留字符串里面的格式来 test_str=""" \r\n测试标题 hello world ...

  5. activiti 条件表达式json报错_2020年2月13日学习python 条件控制

    2020年2月13日学习python 条件控制 所谓条件(condition):指的是成立的条件,即返回值是True的布尔表达式. 运行报错: def account_login(): passwor ...

  6. python打开文件报错无效序列_如何在python中读取fasta文件?

    我正在尝试读取FASTA文件,然后查找特定的 motif(string)并打印出序列和次数. A FASTA file只是一系列序列(字符串),以标题行开头,标题或新序列的开头是">& ...

  7. python运行启动报错解决方法_pyspider启动错误解决(Python 3.7)

    问题一 安装好pyspider之后,在启动的时候,报出上图错误. 原因 async和await从 python3.7 开始已经加入保留关键字中. 参考: What's New In Python 3. ...

  8. python导入模块报错syntaxerror_python import错误 SyntaxError: invalid syntax

    Python 3.6print 出现 SyntaxError: invalid syntax 开始使用sublime学习python,编写代码如图 Ctrl+B运行以后,报错   SyntaxErro ...

  9. python连接数据库mysql失败_解决python连接mysql报错问题

    解决python连接mysql报错问题 最近跑python脚本时遇到一个问题,当sql语句中有中文时,执行python脚本报以下错误: Traceback (most recent call last ...

最新文章

  1. netsh与用法--XP的各种网络命令
  2. 亚洲游戏行业遭遇史上最大DDoS攻击,微软:我给扛下来了
  3. 远程桌面连接提示“您的凭据不工作”
  4. CSS3笔记之定位篇(二)z-index
  5. 数据挖掘 点击更多 界面_6(更多)技巧,可快速改善用户界面
  6. vs使用ado连接oracle,在VS环境下以ADO方式操作Oracle数据库
  7. python进阶之学习笔记_干货 | Python进阶系列之学习笔记(四)
  8. 工作57:element格式化内容
  9. Android JNI学习(五)——Java与Native之间如何实现相互调用
  10. java token生成和验证_程序员应该如何设计更优雅的Token认证方式?
  11. vmw6.5安装Freebsd8.1桌面gnome
  12. Colidity-- Dominator
  13. HDU 6188 2017广西邀请赛:Duizi and Shunzi
  14. 计算机仿真实验报告实验原理简述,数控编程实验报告总结
  15. 分类排序 同辈元素只在数据上的层级关系
  16. 八爪鱼抓取html,网页图片采集和抓取方法详解 - 八爪鱼采集器
  17. win10设置文件默认打开方式
  18. POS、银联密钥体系
  19. 吊炸天核心Java面试问题,一问一答题,一问多答题(建议学习)
  20. 不知不觉,二哥 CSDN 博客访问量破 1000 万了,这个成绩,全网也没几个吧?

热门文章

  1. 横向剪切干涉matlab仿真,横向剪切干涉检测非球面波前数值模拟
  2. 修改计算机网络适配器的IPv4地址
  3. 基于51单片机的电子秒表设计
  4. SQLite Expert
  5. RIKIBOT-FX4 多线激光雷达用3D数据+谷歌cartographer算法直接构建2D地图
  6. Ubuntu安装Battery Historian分析电量(配置环境)
  7. Golang 单引号、双引号和反引号
  8. 中学生听说能力测试软件,初中生学习软件排行榜 适合初中生学习的APP推荐
  9. 股市暴跌深如利日内回交易策略低持仓成本
  10. [NOIP2008] 火柴棒等式