Python3基础(九) 错误和异常
本文主要介绍Python中的错误和异常,涉及到简单的异常处理、抛出异常以及清理动作。至于自定义异常类,将在介绍类与继承的时候讲到。
一、定义
常见的两种错误:语法错误 和 异常。
1、语法错误(Syntax Errors)
语法错误,也就是解析时错误。当我们写出不符合python语法的代码时,在解析时会报SyntaxError,并且会显示出错的那一行,并用小箭头指明最早探测到错误的位置。比如:
x = input('please input an integer:')
if int(x) > 5:
print 'hello world'
在python 3中会报语法错误:
File "/home/songlee/test", line 3
print 'hello world'
^
SyntaxError: invalid syntax
2、异常(Exceptions)
即使语句或表达式在语法上是正确的,但在尝试运行时也可能发生错误,运行时错误就叫做 异常(Exceptions) 。异常并不是致命的问题,因为我们可以在程序中对异常进行处理。
>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero >>> 2 + x*3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined >>> '2' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
上面展示了三种exception的类型:ZeroDivisionError、NameError、TypeError ,它们都是内置异常的名称。标准异常的名字是内建的标识符 (但并不是关键字)。
二、处理异常(try…except…)
我们可以使用 try…except… 语句来处理异常。try 语句块中是要执行的语句,except 语句块中是异常处理语句。一个 try 语句可以有多条的 except 语句,用以指定不同的异常,但至多只有一个会被执行:
try:
x = int(input('please input an integer:'))
if 30/x > 5:
print('Hello World!')
except ValueError:
print('That was no valid number. Try again...')
except ZeroDivisionError:
print('The divisor can not be zero, Try again...')
except:
print('Handling other exceptions...')
上面这段代码,当输入a(非数字)时,将抛出ValueError异常;当输入0时,将抛出ZeroDivisionError异常;当抛出其他类型的异常时,将执行except:后的处理语句。
如果在 try 语句执行时,出现了一个异常,该语句的剩下部分将被跳过。并且如果该异常的类型匹配到了 except 后面的异常名,那么该 except 后的语句将被执行。注意,如果 except 后面没有跟异常名,表示它匹配任何类型的异常,except:必须放在最后。
一个 except 语句可以同时包括多个异常名,但需要用括号括起来,比如:
except (RuntimeError, TypeError, NameError):
pass
try...except...语句可以有一个可选的 else 语句。else 语句必须要放在所有 except 语句后面,当没有异常发生的时候,else 从句将被执行:
try:
name = input('please input an integer:')
f = open(name, 'r')
except IOError:
print('Cannot open', name)
except:
print('Unexpected errors.')
else:
print('close the file', name)
f.close()
三、抛出异常(raise)
raise 语句允许程序员强制地抛出一个特定的异常,例如:
>>> raise NameError('HiThere') # 抛出异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: HiThere
raise 抛出的异常必须是一个异常实例或类(派生自 Exception 的类)。
四、清理动作(finally)
try 语句有另一种可选的finally从句,用于自定义一些扫尾清理的工作。
try:
x = int(input('please input an integer:'))
if x > 5:
print('Hello World!')
except ValueError:
print('It was not a number. Try again.')
finally:
print('Some clean-up actions!')
与 else 从句的区别在于: else 语句只在没有异常发生的情况下执行,而 finally 语句则不管异常发生与否都会执行。准确的说,finally 语句总是在退出 try 语句前被执行,无论是正常退出、异常退出,还是通过break、continue、return退出。
>>> def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print('error: division by zero!')
... else:
... print('executing else-clause,', 'result is', result)
... finally:
... print('executing finally-clause')
... >>> divide(2, 1) # 正常退出
executing else-clause, result is 2.0
executing finally-clause >>> divide(2, 0) # 异常退出
error: division by zero!
executing finally-clause >>> divide('2', '1') # 异常退出,异常未被处理。
executing finally-clause
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'
从上面看出,finally 语句在任何情况下都被执行了。对于没有被 except 处理的异常,将在执行完 finally 后被重新抛出。
另外,有些对象预定义了标准的清理动作(clean-up actions)。当对象不再需要时,该动作将被执行,无论对其使用的操作是否成功。例如下面的文件I/O例子:
for line in open("myfile.txt"):
print(line, end="")
这段代码的问题在于,在此代码成功执行后,文件依然被打开着。但with语句可以让文件对象在使用后被正常的清理掉:
with open("myfile.txt") as f:
for line in f:
print(line, end="")
在执行该语句后,文件 f 就会被关闭,就算是在读取时碰到了问题,文件 f 也会被关闭。像文件这样的对象,总会提供预定义的清理工作。
个人站点:http://songlee24.github.com
Python3基础(九) 错误和异常的更多相关文章
- Flask基础(08)-->错误捕获(异常捕获)
错误捕获(异常捕获) from flask import Flask from flask import abort app = Flask(__name__) @app.route('/demo1' ...
- Python3基础 try-except 几个异常采取同样的处理方法
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Python3基础 raise + 指定类型异常+异常的解释 产生特定类型异常
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Python3基础 raise 产生RuntimeError 异常
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- python系列十五:Python3 错误和异常
#!/usr/bin/python #-*-coding:gbk-*- #Python3 错误和异常'''Python 语法错误或者称之为解析错语法分析器指出了出错的一行,并且在最先找到的错误的位置标 ...
- 转 Python3 错误和异常/ Python学习之错误调试和测试
########sample 0 https://www.cnblogs.com/Simon-xm/p/4073028.html except: #捕获所有异常 except: <异常名> ...
- python021 Python3 错误和异常
Python3 错误和异常 作为Python初学者,在刚学习Python编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍. Python有两种错误很容易辨认:语法错误和异常. ...
- Python3 错误和异常
Python有两种错误很容易辨认:语法错误和异常. 语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 >>> while True print('He ...
- python3快速入门教程错误和异常
Python 中(至少)有两种错误:语法错误(syntax errors)和异常(exceptions). 语法错误 语法错误又称作解析错误: >>> while True prin ...
随机推荐
- thinkphp信息修改和分页
关联两个数据表,在Model里建立StuModel.class.php: <?php //Belongs_to 关联表示当前模型从属于另外一个父对象 namespace Admin\Model; ...
- HDU_3182_Hamburger Magi_状态压缩dp
Hamburger Magi Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 音视频】5.ffmpeg命令分类与使用
GT其实平时也有一些处理音视频的个人或者亲人需求,熟练使用ffmpeg之后也不要借助图示化软件,一个命令基本可以搞定 G: 熟练使用ffmpeg命令!T :不要死记硬背,看一遍,自己找下规律,敲一遍, ...
- CAD在一个点构造选择集(网页版)
主要用到函数说明: IMxDrawSelectionSet::SelectAtPoint 在一个点构造选择集.详细说明如下: 参数 说明 [in] IMxDrawPoint* point 点坐标 [i ...
- CAD利用Select2得到所有实体(网页版)
主要用到函数说明: IMxDrawSelectionSet::Select2 构造选择集.详细说明如下: 参数 说明 [in] MCAD_McSelect Mode 构造选择集方式 [in] VARI ...
- 08Microsoft SQL Server 数据查询
Microsoft SQL Server 数据查询 单表查询所有列 --查询所有行所有列 select all * from table; --查询不重复行的所有列 select distinct * ...
- 利用gsoap库封装易用的rest框架
c++缺少web开发的框架,web框架分为异步和同步,异步的业务逻辑控制需要较强功底,同步代码实现起来容易,利于阅读理解 1.gsoap是c++写的webservice库,webservice应用层也 ...
- 「 COGS 2240 」 X 「 Luogu P2885 」 架设电话线
解题思路 首先很容易就想到了一个二维的朴素的 $dp$. 设 $dp[i][j]$ 表示第 $i$ 个位置的电话线杆的高度为 $j$ 时的最小花费,就需要枚举第 $i$ 个电话线杆.第 $i$ 个电话 ...
- [bzoj1966][Ahoi2005][VIRUS 病毒检测] (字符串dp)
Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...
- java Beanutils.copyProperties( )用法
这是一篇开发自辩甩锅稿~~~~ 昨天测试小姐姐将我的一个bug单重开了,emmmm....内心OS:就调整下对象某个属性类型这么简单的操作,我怎么可能会出错呢,一定不是我的锅!!but再怎么抗拒,bu ...