python里面的报错语句翻译_(翻译)30天学习Python
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相关推荐
- python打开文件报错无效序列_解决Python 写文件报错TypeError的问题
处理上传的文件: f1 = request.FILES['pic'] fname = '%s/%s' % (settings.MEDIA_ROOT, f1.name) with open(fname, ...
- python运行启动报错解决方法_解决python运行启动报错问题
解决python运行启动报错问题 问题一: python启动报错api-ms-win-crt-process-l1-1-0.dll丢失 解决: 下载api-ms-win-crt-process-l1- ...
- python def函数报错详解_【python】详解python函数定义 def()与参数args、可变参数*args、关键参数**args使用实例...
Python内置了很多函数,可以直接调用.Python内置的函数可以通过官方文档查看.也可以通过help()查看帮助信息.函数名是指向函数对象的引用,把函数名赋给变量,相当于给函数起了别名. 1. 定 ...
- python打开文件报错无效序列_黑马python入门(4):python基础(序列,异常,操作文件,模块包,日志调试信息)
序列 str声明:test_str="abcedf" 也可以保留字符串里面的格式来 test_str=""" \r\n测试标题 hello world ...
- activiti 条件表达式json报错_2020年2月13日学习python 条件控制
2020年2月13日学习python 条件控制 所谓条件(condition):指的是成立的条件,即返回值是True的布尔表达式. 运行报错: def account_login(): passwor ...
- python打开文件报错无效序列_如何在python中读取fasta文件?
我正在尝试读取FASTA文件,然后查找特定的 motif(string)并打印出序列和次数. A FASTA file只是一系列序列(字符串),以标题行开头,标题或新序列的开头是">& ...
- python运行启动报错解决方法_pyspider启动错误解决(Python 3.7)
问题一 安装好pyspider之后,在启动的时候,报出上图错误. 原因 async和await从 python3.7 开始已经加入保留关键字中. 参考: What's New In Python 3. ...
- python导入模块报错syntaxerror_python import错误 SyntaxError: invalid syntax
Python 3.6print 出现 SyntaxError: invalid syntax 开始使用sublime学习python,编写代码如图 Ctrl+B运行以后,报错 SyntaxErro ...
- python连接数据库mysql失败_解决python连接mysql报错问题
解决python连接mysql报错问题 最近跑python脚本时遇到一个问题,当sql语句中有中文时,执行python脚本报以下错误: Traceback (most recent call last ...
最新文章
- netsh与用法--XP的各种网络命令
- 亚洲游戏行业遭遇史上最大DDoS攻击,微软:我给扛下来了
- 远程桌面连接提示“您的凭据不工作”
- CSS3笔记之定位篇(二)z-index
- 数据挖掘 点击更多 界面_6(更多)技巧,可快速改善用户界面
- vs使用ado连接oracle,在VS环境下以ADO方式操作Oracle数据库
- python进阶之学习笔记_干货 | Python进阶系列之学习笔记(四)
- 工作57:element格式化内容
- Android JNI学习(五)——Java与Native之间如何实现相互调用
- java token生成和验证_程序员应该如何设计更优雅的Token认证方式?
- vmw6.5安装Freebsd8.1桌面gnome
- Colidity-- Dominator
- HDU 6188 2017广西邀请赛:Duizi and Shunzi
- 计算机仿真实验报告实验原理简述,数控编程实验报告总结
- 分类排序 同辈元素只在数据上的层级关系
- 八爪鱼抓取html,网页图片采集和抓取方法详解 - 八爪鱼采集器
- win10设置文件默认打开方式
- POS、银联密钥体系
- 吊炸天核心Java面试问题,一问一答题,一问多答题(建议学习)
- 不知不觉,二哥 CSDN 博客访问量破 1000 万了,这个成绩,全网也没几个吧?