Python指南--错误和异常
Python指南--错误和异常
8.1 语法错误
8.2 异常
8.3 处理异常
8.4 抛出异常
8.5 用户自定义异常
8.6 定义清理行为
8. 错误和异常
8.1 语法错误
语法错误,也称作解析错误,可能是学习Python的过程中最容易犯的:
>>> while True print 'Hello world'File "", line 1, in ?while True print 'Hello world'^ SyntaxError: invalid syntax
8.2 异常
>>> 10 * (1/0) Traceback (most recent call last):File "", line 1, in ? ZeroDivisionError: integer division or modulo by zero >>> 4 + spam*3 Traceback (most recent call last):File "", line 1, in ? NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last):File "", line 1, in ? TypeError: cannot concatenate 'str' and 'int' objects
这一行后一部分是关于该异常类型的详细说明,这意味着它的内容依赖于异常类型。
错误信息的前半部分以堆栈的形式列出异常发生的位置。通常在堆栈中列出了源代码行,然而,来自标准输入的源码不会显示出来。
8.3 处理异常
>>> while True: ... try: ... x = int(raw_input("Please enter a number: ")) ... break ... except ValueError: ... print "Oops! That was no valid number. Try again..." ...
首先,执行 try 子句(在try 和 except关键字之间的部分)。
如果没有异常发生,except 子句 在try语句执行完毕后就被忽略了。
如果在try子句执行过程中发生了异常,那么该子句其余的部分就会被忽略。如果异常匹配于except关键字后面指定的异常类型,就执行对应的except子句,忽略try子句的其它部分。然后继续执行try语句之后的代码。
如果发生了一个异常,在except子句中没有与之匹配的分支,它就会传递到上一级try语句中。如果最终仍找不到对应的处理语句,它就成为一个未处理异常,终止程序运行,显示提示信息。
一个try 语句可能包含多个 except 子句,分别指定处理不同的异常。至多只会有一个分支被执行。异常处理程序只会处理对应的try子句中发生的异常,在同一个try语句中,其他子句中发生的异常则不作处理。一个except子句可以在括号中列出多个异常的名字,例如:
... except (RuntimeError, TypeError, NameError): ... pass
最后一个except子句可以省略异常名,把它当做一个通配项使用。一定要慎用这种方法,因为它很可能会屏蔽掉真正的程序错误,使人无法发现!它也可以用于打印一行错误信息,然后重新抛出异常(可以使调用者更好的处理异常)。
import string, systry:f = open('myfile.txt')s = f.readline()i = int(string.strip(s)) except IOError, (errno, strerror):print "I/O error(%s): %s" % (errno, strerror) except ValueError:print "Could not convert data to an integer." except:print "Unexpected error:", sys.exc_info()[0]raise
try ... except 语句可以带有一个 else 子句, 该子句只能出现在所有except子句之后。当try语句没有抛出异常时,需要执行一些代码,可以使用这个子句。例如:
for arg in sys.argv[1:]:try:f = open(arg, 'r')except IOError:print 'cannot open', argelse:print arg, 'has', len(f.readlines()), 'lines'f.close()
使用 else 子句比在 try 子句中附加代码要好,因为这样可以避免 try ... except 意外的截获本来不属于它们保护的那些代码抛出的异常。
发生异常时,可能会有一个附属值,作为异常的参数存在。这个参数是否存在、是什么类型,依赖于异常的类型。
在异常名(列表)之后,也可以为 except 子句指定一个变量。这个变量绑定于一个异常实例,它存储在instance.args
的参数中。为了方便起见,异常实例定义了
__getitem__ 和 __str__ ,这样就可以直接访问过打印参数而不必引用 .args
。
>>> try: ... raise Exception('spam', 'eggs') ... except Exception, inst: ... print type(inst) # the exception instance ... print inst.args # arguments stored in .args ... print inst # __str__ allows args to printed directly ... x, y = inst # __getitem__ allows args to be unpacked directly ... print 'x =', x ... print 'y =', y ... ('spam', 'eggs') ('spam', 'eggs') x = spam y = eggs
对于未处理的异常,如果它有一个参数,那做就会作为错误信息的最后一部分(“明细”)打印出来。
异常处理句柄不止可以处理直接发生在try子句中的异常,即使是其中(甚至是间接)调用的函数,发生了异常,也一样可以处理。例如:
>>> def this_fails(): ... x = 1/0 ... >>> try: ... this_fails() ... except ZeroDivisionError, detail: ... print 'Handling run-time error:', detail ... Handling run-time error: integer division or modulo
8.4 抛出异常
在发生了特定的异常时,程序员可以用 raise 语句强制抛出异常。例如:
>>> raise NameError, 'HiThere' Traceback (most recent call last):File "", line 1, in ? NameError: HiThere
如果你决定抛出一个异常而不处理它,raise 语句可以让你很简单的重新抛出该异常。
>>> try: ... raise NameError, 'HiThere' ... except NameError: ... print 'An exception flew by!' ... raise ... An exception flew by! Traceback (most recent call last):File "", line 2, in ? NameError: HiThere
8.5 用户自定义异常
在程序中可以通过创建新的异常类型来命名自己的异常。异常类通常应该直接或间接的从 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, e: ... print 'My exception occurred, value:', e.value ... My exception occurred, value: 4 >>> raise MyError, 'oops!' Traceback (most recent call last):File "", line 1, in ? __main__.MyError: 'oops!'
class Error(Exception):"""Base class for exceptions in this module."""passclass InputError(Error):"""Exception raised for errors in the input.Attributes:expression -- input expression in which the error occurredmessage -- explanation of the error"""def __init__(self, expression, message):self.expression = expressionself.message = messageclass TransitionError(Error):"""Raised when an operation attempts a state transition that's notallowed.Attributes:previous -- state at beginning of transitionnext -- attempted new statemessage -- explanation of why the specific transition is not allowed"""def __init__(self, previous, next, message):self.previous = previousself.next = nextself.message = message
很多标准模块中都定义了自己的异常,用以报告在他们所定义的函数中可能发生的错误。关于类的进一步信息请参见第 9章,“类”。
8.6 定义清理行为
try 语句还有另一个可选的子句,目的在于定义在任何情况下都一定要执行的功能。例如:
>>> try: ... raise KeyboardInterrupt ... finally: ... print 'Goodbye, world!' ... Goodbye, world! Traceback (most recent call last):File "", line 2, in ? KeyboardInterrupt
在finally 子句中的代码用于释放外部资源(例如文件或网络连接),不管这些资源是否已经成功利用。
在 try 语句中可以使用若干个 except 子句或一个 finally 子句,但两者不能共存。
Python指南--错误和异常相关推荐
- python中if错误-Python中错误和异常
第1章 概念 错误 语法错误:代码不符合解释器或编译器的语法 逻辑错误:不完整或不合法的输入或者计算出现问题 异常:代码执行过程中,出现问题导致程序无法执行 程序遇到逻辑或算法问题 运行过程中计算机错 ...
- python 语法错误 和异常_Python基础知识:新手学Python时常见的语法错误和异常
大家好,今天我们简单介绍下在学习Python时常见的一些错误和异常. 记得刚接触Python的时候,一条简单的语句在执行的时候却总能遇到报错.然后各种艰难的复查发现可能是循环语句缺少冒号啊.用了中文的 ...
- Python语法错误和异常
语法错误和异常 语法错误和异常 异常和错误 处理异常 捕获指定异常 异常中的else 异常的finally 自定义异常类型 语法错误和异常 异常和错误 错误分为两种:语法错误与异常 语法错误:指拼写代 ...
- python中语法错误-Python语法错误与异常及异常处理方法
回顾 在Python进阶记录之基础篇(二十)中,我们介绍了Python面向对象中的类方法和静态方法,以及类中拥有特殊功能的魔法函数.需要重点掌握类方法和静态方法的概念和基本用法,理解魔法函数的作用冰女 ...
- 【python】错误、异常和文件---复习笔记
错误.异常和文件 1. 异常处理 错误指的是代码有语法问题,无法解释运行,必须改正后才能运行 如果代码没有语法问题,可以运行,但会出运行时的错误,例如除零错误,下标越界等问题,这种在运行期间检测到的错 ...
- python错误-新手常见Python错误及异常解决处理方案
写Python代码的小伙伴不可避免地会遇到代码执行错误和异常,这次就来详细且不失通俗地总结一下python中的错误和异常. 先抛出两个问题: 什么是Python错误和异常? 如何处理Python错误和 ...
- python常见错误-新手常见Python错误及异常解决处理方案
写Python代码的小伙伴不可避免地会遇到代码执行错误和异常,这次就来详细且不失通俗地总结一下python中的错误和异常. 先抛出两个问题: 什么是Python错误和异常? 如何处理Python错误和 ...
- 怎么解决python遇到问题_新手常见Python错误及异常解决处理方案
新手常见Python错误及异常解决处理方案,异常,错误,语句,子句,代码 新手常见Python错误及异常解决处理方案 易采站长站,站长之家为您整理了新手常见Python错误及异常解决处理方案的相关内容 ...
- 一日一技:一文搞懂Python错误和异常
写Python代码的小伙伴不可避免地会遇到代码执行错误和异常,这次就来详细且不失通俗地总结一下python中的错误和异常. 先抛出两个问题: 什么是Python错误和异常? 如何处理Python错误和 ...
- 关于Python中的错误与异常,你是否了解的够仔细?
每次版本结束都描述这着同样的错误,相似的问题,但始终没见解决.所以今天,我就来总结下Python的错误与异常! 异常与错误 错误 语法错误 可以通过IDE或者解释器给出提示的错误 opentxt('a ...
最新文章
- 把接口调用打成jar包的类怎么写_直观讲解RPC调用和HTTP调用的区别
- 解析不是utf-8的xml文件 附(tag 属性的获取 )
- 浅谈 Nginx与PHP 交互
- python从入门到精通书-Python从入门到精通(资源汇总)
- LetCode 15 三数之和
- 科研小白在首次论文写作时需要注意哪些问题?
- seata+nacos出现failed to req API:/nacos/v1/ns/instance/beat after all servers([127.0.0.1:8848])
- PgSQL · 案例分享 · PostgreSQL+HybridDB解决企业TP+AP混合需求
- [置顶] CopyU!v2插件合集 [2013年7月18日更新]
- 【图像处理】——Python图像分割边缘检测算法之一阶梯度算子(Roberts、Prewitt、Sobel、 Kirsch、Canny算子)
- 基于APPIUM的移动自动化测试
- android获取手机的IMSI码
- 地推主管需要跑业务吗
- DesiredCapabilities内容详解--Appium服务关键字
- 多变量微积分笔记19——直角坐标系和柱坐标系下的三重积分
- 如何用记事本编写Java代码?
- 测试一下你真的理解数据库左连接了吗?
- 罗技键盘连计算机,罗技键盘怎么连接电脑(罗技键盘使用教程及性能评测)
- 骑士CMS文件包含+getshell漏洞复现(python自动化验证扫描漏洞)
- 系统迁移到ssd 开启哪些服务器,如何使用分区助手完美迁移系统到SSD固态硬盘...