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. Mac使用GNU版本的sed

    今天在mac下用sed试图替换\t ,结果发现不生效,Google之后发现mac作为unix分支的系统上的sed与GNU版本的sed行为不太一致. 使用以下命令安装GNU命令套件: brew inst ...

  2. Restframework框架总结及restful规范

    1. django rest framework框架的作用? 帮助开发者可以快速开发出遵循restful规范的API 2. django rest framework框架都有哪些组件(10)? -版本 ...

  3. oracle 完整性约束的禁用启用以及对表的影响,表的修改和复制

    primary key ----表的唯一性约束,不能为空,且不能有重复值 foreign key ----俩表之间的约束,启用之时,在删除数据时需要先删除父表数据,再删除子表数据 禁用方式为:alte ...

  4. CentOS 7 下 Oracle 11g 安装教程

    一.准备工作 1.关闭selinux   查看selinux状态:   getenforce或者sestatus -v   临时关闭:   setenforce 0   永久关闭:   vim /et ...

  5. c#项目总结

    写了将近10年代码了,最后休息,回想了下,感觉什么都没有. 所以打算写一些总结性的文章,先写几个项目,用于c#各个方向的封装使用 最后汇总成一个完善的解决方案.所有项目都在一个解决方案FastAIFr ...

  6. JavaScript 基础(四) 循环

    JavaScript的循环有两种,一种是for 循环,通过初始条件,结束条件和递增条件来循环执行语句块: var x = 0; var i; for(i=1; i <=10000; i++){ ...

  7. CommonJs模块规范

    1.什么是模块化 文件作用域 通信规则 加载 require 导出 exports 2.CommonJs模块规范 在Node中的Javascript还有一个很重要的概念:模块概念 模块作用域 使用re ...

  8. CF1042A 【Benches】(优先队列)

    这是一道良心的cf题 题意里让你求的是来了m个人后人数最多的长椅上最少和最多有多少人 如果要求最多,很好办,m个人都挤到原来人数最多的长椅上了(一眼看出) 但如果要求最少呢? 大家看图 长椅某个时间的 ...

  9. 使用第三方工具连接docker数据库

    一.背景 ​ 为了把测试环境迁移至docker上,我在centos7上安装了docker,具体安装方法可参考<CentOS7下安装docker>本文不再论述.有些同学可能会有疑问,为什么要 ...

  10. chrome debugger 调试

    debugger 使用chrome调试时,html页面的js代码中可能不好打断点(因为在jvm中才会有代码) 我一开始是故意在需要断点的后面或前面写个错的alert,通过jvm找到此处,然后在需要的地 ...