Python 3 学习笔记之——错误和异常
1. 语法错误
Python 的语法错误被称为解析错,语法分析器会指出出错的代码行,并且在最先找到的错误的位置标记一个小小的箭头。
>>> while True
File "<stdin>", line 1
while True
^
SyntaxError: invalid syntax
2. 异常
即使 Python 程序的语法是正确的,但是在运行的时候,也有可能发生错误,运行期监测到的错误称为异常。
>>> print(name)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'name' is not defined
>>> a = [1, 2, 3]
>>> b = a(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
>>> 10 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
3. 异常处理
try 语句按照以下方式工作:
- 首先,执行 try 子句,也就是在 try 和 except 之间的语句
- 如果没有异常发生,忽略 except 子句,程序继续运行
- 如果在 try 子句执行过程中发生了异常,那么 try 子句余下的部分将被忽略
- 若异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行,然后再执行 try 语句之后的代码
- 若异常没有与任何的 except 匹配,那么这个异常将会传递到上层的 try 中去
while True:
try:
x = int(input("Please enter a number: "))
break
except ValueError:
print("Oops! That was no valid number. Try again!")
Please enter a number: we
Oops! That was no valid number. Try again!
Please enter a number: sd
Oops! That was no valid number. Try again!
Please enter a number: 23
在上面的例子中,我们让用户通过键盘来输入一个合法的整数。如果输入的是字符串,那 int 函数就无法将字符串转为整数,程序就会抛出一个异常,然后执行 except 子句,打印信息提示我们重新输入,直到输入一个整数程序 break 结束。
一个 except 子句可以同时处理多个异常,这些异常被放在一个括号里成为一个元组。
except (RuntimeError, TypeError, NameError):
pass
最后一个 except 子句可以忽略异常的名称,它将被当做通配符使用。此时可以打印出错误信息,然后再次把异常抛出。
import sys
try:
f = open('test.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise
# 没有相应文件时报错
OS error: [Errno 2] No such file or directory: 'test.txt'
# 文件中第一行为字符串无法转化为整数时报错
Could not convert data to an integer.
try except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。这个子句将在try子句没有发生任何异常的时候执行。
import sys
try:
f = open('test.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise
else:
print(i)
# 1
使用 else 子句比把所有语句都放在 try 子句里面要好,这样可以避免一些意想不到的而 except 又没有捕获到的异常。
异常处理也可以处理子句中调用函数甚至是间接调用函数里抛出的异常。
3. 用户自定义异常
我们可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception,可以直接继承,或者间接继承。
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
try:
raise MyError(2*2)
except MyError as e:
print('My exception occurred, value:', e.value)
# My exception occurred, value: 4
4. 定义清理行为
try 语句还有另外一个可选的子句 finally,它定义了无论任何情况下都会执行的清理行为。
def divide(x, y):
try:
result = x / y
except ZeroDivisionError:
print("division by zero!")
else:
print("result is", result)
finally:
print("executing finally clause")
divide(2, 1)
result is 2.0
executing finally clause
divide(2, 0)
division by zero!
executing finally clause
divide('2', '1')
executing finally clause
TypeError Traceback (most recent call last)
<ipython-input-19-0fe65f250ff1> in <module>()
----> 1 divide('2', '1')
<ipython-input-16-fb375c737bea> in divide(x, y)
1 def divide(x, y):
2 try:
----> 3 result = x / y
4 except ZeroDivisionError:
5 print("division by zero!")
TypeError: unsupported operand type(s) for /: 'str' and 'str'
一些对象定义了标准的清理行为,当程序中不需要它的时候,那么这个标准行为就会执行。关键词 with 语句可以保证诸如文件之类的对象在使用完之后一定会正确=地执行清理行为。
参考资料 菜鸟教程
获取更多精彩,请关注「seniusen」!

Python 3 学习笔记之——错误和异常的更多相关文章
- Python学习笔记七-错误和异常
程序员总是和各种错误打交道,学习如何识别并正确的处理程序错误是很有必要的. 7.1错误和异常 1.错误 从软件方面来看,错误分为语法错误和逻辑错误两种.这两种错误都将导致程序无法正常进行下去,当Pyt ...
- python学习笔记014——错误和异常
Python有两种错误很容易辨认:语法错误和异常. 1 什么是语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 if i>4 print("if语句输出 ...
- Python学习笔记13—错误和异常
常见的异常:
- Python基础学习笔记(十三)异常
参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-exceptions.html Python用异常对象(excep ...
- Python Requests-学习笔记(9)-错误与异常
遇到网络问题(如:DNS查询失败.拒绝连接等)时,Requests会抛出一个ConnectionError 异常. 遇到罕见的无效HTTP响应时,Requests则会抛出一个 HTTPError 异常 ...
- Python学习 Part6:错误和异常
Python学习 Part6:错误和异常 两种不同类型的错误:语法错误和异常 1. 语法错误 语法错误,也被称作解析错误: >>> while True print('Hello w ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- Python Click 学习笔记(转)
原文链接:Python Click 学习笔记 Click 是 Flask 的团队 pallets 开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现.恰好我最近在开发 ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
随机推荐
- 封装方法到对象(javascript)
/*! * artDialog 5 * Date: 2012-03-21 * http://code.google.com/p/artdialog/ * (c) 2009-2012 TangBin, ...
- sql得到表中的列信息
取列全部用的 sys. 中的表 CTE:WITH name AS() 用法: sql树形查询 ①主键信息 SELECT ic.column_id, ic.index_column_id, ic.o ...
- spring(一)-基本概念
1.定义与特点 定义:一个分模块的一站式后台开发框架. 特征: (1)比起EJB,更轻量级别的容器框架,模块形式组织,只需要调用相应模块(jdbc.springmvc) (2)Spring IOC低耦 ...
- Django-rest-framework(六)filter,ordering,search
filter queryset 使用request.user相关的queryset class PurchaseList(generics.ListAPIView): serializer_class ...
- Swift_数组详解
Swift_数组详解 点击查看源码 初始化 //初始化 fileprivate func testInit() { //空数组 var array = [Int]() print(array) arr ...
- 你不知道的javaScript笔记(1)
规避冲突 function foo(){ function bar(a){ i = 3; console.log(a + i); } for ( var i=0; i < 10; i++){ b ...
- Delphi中CPort控件之Timeout属性
转载:http://blog.sina.com.cn/s/blog_70146dce0102wep1.html Cport的Timeout属性定义了详细的读写超时设置. 当一个特别操作的超时时间达到了 ...
- Ansible自动化配置详解
第1章 Ansible基本概述 1.1 ansible是一个配置管理系统configuration management system, 你只需要可以使用ssh访问你的服务器或设备就行. 1.安装软件 ...
- yum仓库客户端搭建和NTP时间同步客户端配置
一.yum仓库客户端搭建 yum源仓库搭建分为服务器端和客户端. 服务端主要提供软件(rpm包)和yumlist.也就是提供yum源的位置.一般是通过http或者ftp提供位置. 客户端的配置:yum ...
- flask的自定义过滤器
过滤器的本质是函数.当模板内置的过滤器不能满足需求,可以自定义过滤器.自定义过滤器有两种实现方式: 一种是通过Flask应用对象的 add_template_filter 方法 通过装饰器来实现自定义 ...