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 ...
随机推荐
- Json-->Newton.Json.dll的使用方法
Newton.Json.dll for .NET2.0 实体1 public class Student { public string ID { get; set; } ...
- opencv3.31+vs2015终于配置成功了
风萧萧兮易水寒, 熬了几个夜晚,终于把opencv配好了, 来图一 唉试了很多方法,终于成功. 教程和资料会发在个人网站里. 测试 代码 #include <iostream> #incl ...
- [算法天天练] - C语言实现约瑟夫环(2)
Linux下 #include <stdlib.h>#include <stdio.h> int main(){ int n,m,i,s = 0; printf("E ...
- 解决:未能加载文件或程序集“System.Web.Http, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
今天发布web API,调用接口报错了:未能加载文件或程序集“System.Web.Http, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31b ...
- C# 调用带有输出参数的分页存储过程
一.创建带有输出参数的分页存储过程 use StudentMISDB go select * from Course alter table Course go --update Course set ...
- dubbo-monitor安装及配置过程
安装 1. 使用git下载(git clone https://github.com/alibaba/dubbo.git)或者从http://dubbo.io/下载源码 2. cd到dubbo的根目录 ...
- Mybatis与Spring整合方法
实现mybatis与spring进行整合,通过spring管理SqlSessionFactory.mapper接口. tips:mybatis官方提供与mybatis与spring整合jar包. 一. ...
- thinkphp 5.0 “No input file specified”问题
最近在用thinkphp5.0,想要试一下强制路由模式,却发现一直报错, 在网上一通乱找,最后发现是因为不能正确识别path_info造成的, 解决方案就是在 public目录下修改 ".h ...
- NOIP 2008 传纸条(洛谷P1006,动态规划递推,滚动数组)
题目链接:P1006 传纸条 PS:伤心,又想不出来,看了大神的题解 AC代码: #include<bits/stdc++.h> #define ll long long using na ...
- Luogu P3797 妖梦斩木棒
解题思路 用线段树做这个就不用说了吧,但是要维护的东西确实很神奇.在每一个节点上都维护一个$lbkt$,表示这个区间上最靠左的右括号的位置:一个$rbkt$,表示这个区间上最靠右的左括号的位置.还有一 ...