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 学习笔记之——错误和异常的更多相关文章

  1. Python学习笔记七-错误和异常

    程序员总是和各种错误打交道,学习如何识别并正确的处理程序错误是很有必要的. 7.1错误和异常 1.错误 从软件方面来看,错误分为语法错误和逻辑错误两种.这两种错误都将导致程序无法正常进行下去,当Pyt ...

  2. python学习笔记014——错误和异常

    Python有两种错误很容易辨认:语法错误和异常. 1 什么是语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 if i>4 print("if语句输出 ...

  3. Python学习笔记13—错误和异常

    常见的异常:

  4. Python基础学习笔记(十三)异常

    参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-exceptions.html Python用异常对象(excep ...

  5. Python Requests-学习笔记(9)-错误与异常

    遇到网络问题(如:DNS查询失败.拒绝连接等)时,Requests会抛出一个ConnectionError 异常. 遇到罕见的无效HTTP响应时,Requests则会抛出一个 HTTPError 异常 ...

  6. Python学习 Part6:错误和异常

    Python学习 Part6:错误和异常 两种不同类型的错误:语法错误和异常 1. 语法错误 语法错误,也被称作解析错误: >>> while True print('Hello w ...

  7. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  8. Python Click 学习笔记(转)

    原文链接:Python Click 学习笔记 Click 是 Flask 的团队 pallets 开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现.恰好我最近在开发 ...

  9. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

随机推荐

  1. Android学习笔记_12_网络通信之从web获取资源数据到Android

    从web获取图片信息,并显示到android的imageView控件. 一.添加网络访问权限. <uses-permission android:name="android.permi ...

  2. mysql——约束

    非空约束: create table temp( id int not null, name varchar() not null default 'adc', sex char null )//给i ...

  3. java类的初始化程序块以及被实例化时候的执行顺序

    初始化块:在类实例化过程中初始化执行顺序是先执行静态初始化块,然后执行普通初始化块,最后执行构造函数,而且静态初始化只在第一次被实例化时执行且只执行一次.public class HelloWorld ...

  4. springboot缓存的使用

    spring针对各种缓存实现,抽象出了CacheManager接口,用户使用该接口处理缓存,而无需关心底层实现.并且也可以方便的更改缓存的具体实现,而不用修改业务代码.下面对于在springboot中 ...

  5. [Oracle]Oracle表权限小结

    在数据库中,表是我们接触得最多的数据库对象,接下来对与表有关的系统权限与对象权限做一个小结. (1)与表有关的系统权限 CREATE TABLE 在当前Schema中创建.删除.修改表. SELECT ...

  6. window与MAC,多台机器ssh免密码登录同一台机器执行某个脚本,

    参考:https://zhidao.baidu.com/question/586579720.html A B C三台机器上以当前用户运行如下命令生成本主机的公钥和私钥文件: 1 ssh-keygen ...

  7. getElementsByName和getElementById

    1: 今天分享工作中遇到的一个小细节 1.1 先介绍一下两个方法分别是: 1.2 getElementById()  :可返回对拥有指定 ID 的第一个对象的引用,如果您需要查找文档中的一个特定的元素 ...

  8. 判断js中数据类型 的最短代码

    判断字符串类型的: function isString(obj) { return obj+"" === obj; } 判断bool类型的: function isBool(obj ...

  9. 【学时总结】◆学时·IX◆ 整体二分

    ◆学时·IX◆ 整体二分 至于我怎么了解到这个算法的……只是因为发现一道题,明显的二分查找,但是时间会爆炸,被逼无奈搜题解……然后就发现了一些东西QwQ ◇ 算法概述 整体二分大概是把BFS与二分查找 ...

  10. Linux分享笔记:系统状态检测命令小结

    作为一名合格的运维人员,要能很好地了解Linux服务器,要能熟练查看Linux系统的运行状态.以下是常用到的Linux系统状态检测命令. 1. ifconfig:用于获取网卡配置与网络状态等信息.通常 ...