Python学习笔记之九——错误与异常

上海杰彻自动化设备有限公司 发布时间:2017-09-07 12:56:37
Python学习笔记之九——错误与异常

Python 有两种常见的错误:语法错误和异常。

语法错误

语法错误也称之为解析错误。例如:

>>> while True print('Hello world') File "", line 1, in ? while True print('Hello world') ^ SyntaxError: invalid syntax

语法分析器指出了出错的一行,并且在最先找到的错误的位置标记了一个小小的’>箭头’。错误是由箭头前面的标记引起的。在这个例子中,检测到错误发生在函数print(),因为在它之前缺少一个冒号(‘:’)。文件名和行号会一并输出。

异常

即使一条语句或表达式在语法上是正确的,在运行它的时候,也有可能发生错误。在执行期间检测到的错误被称为异常(程序并没有崩溃) 大多数异常都不会被程序处理,导致产生类似下面的错误信息:

>>> 10 * (1/0) Traceback (most recent call last): File "", line 1, in ? ZeroDivisionError: division 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: Can't convert 'int' object to str implicitly

最后的一行错误信息指示异常的原因。异常有不同的类型,其类型会作为消息的一部分打印出来:在这个例子中的类型有 ZeroDivisionError、NameError 和TypeError,打印出来的异常类型的字符串就是内置的异常的名称。用户也可以自定义异常,标准异常的名称都是内置的标识符(不是保留的关键字)。
异常文本最后一部分给出了异常的详细信息和引起异常的原因。
错误信息的前面部分以堆栈回溯的形式显示了异常发生的上下文。通常调用堆栈里会包含源代码的行信息,但是来自标准输入的源码不会显示行信息。
内置的异常列出了内置的异常以及它们的含义。

抛出异常

可以通过编程来选择处理部分异常。下面的例子会一直要求用户输入直到输入一个合法的整数为止,但允许用户中断这个程序(使用 Control-C 或系统支持的任何方法);注意用户产生的中断引发的是KeyboardInterrupt 异常。

>>> while True: ... try: ... x = int(input("Please enter a number: ")) ... break ... except ValueError: ... print("Oops! That was no valid number. Try again...") ...

Try 语句按以下方式工作:
首先,执行try 子句(try 和关键字之间的语句)
如果未发生任何异常,忽略except 子句且try 语句执行完毕。
如果在try 子句执行过程中发生异常,跳过该子句的其余部分,如果异常的类型与except 关键字后面的异常名匹配,则执行except 子句,然后继续执行try语句之后的代码。
如果异常的类型与except 关键字后面的异常名不匹配,它将被传递给上层的try语句;如果没有找到处理异常的代码,它就会成为一个未处理异常,程序会终止运行并显示一条错误信息。
Try 语句可能有多个子句,以指定不同的异常处理程序。不过至多只有一个处理程序将被执行。处理程序只处理发生在相应try 子句中的异常,不会处理同一个try 子句的其他处理程序中发生的异常。一个except 子句可以用带括号的元组列出多个异常的名字。例如:

... except (RuntimeError, TypeError, NameError): ... pass

最后一个except 子句可以省略异常名称(相当于else 一样,异常类型都不是上面的类型,最后一个except 统一处理),但使用这种方式的时候一定要特别小心,因为它会隐藏一个真实的程序错误,可能会引起其它异常,让调用者也去处理这个异常:

import sys try: f = open('myfile.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

try … except 语句有一个可选的else 子句,其出现时,必须放在所有except 子句的后面。主要用于当try 语句没有抛出异常时执行一些代码。

for arg in sys.argv[1:]: try: f = open(arg, 'r') except IOError: print('cannot open', arg) else: print(arg, 'has', len(f.readlines()), 'lines') f.close()

当异常发生时,它可能带有相关数据,也称为异常的参数。参数的有无和类型取决于异常的类型。
except 子句可以在异常的名称之后指定一个变量,这个变量将绑定于一个异常实例,同时异常的参数将存放在实例的args 中。为方便起见,异常实例中定义了一个str()方法,因此异常的参数可以直接打印而不必引用.args。也可以在引发异常之前实例化一个异常,然后向它添加任何想要的属性:

>>> try: ... raise Exception('spam', 'eggs') ... except Exception as inst: ... print(type(inst)) # the exception instance ... print(inst.args) # arguments stored in .args ... print(inst) # __str__ allows args to be printed directly, ... # but may be overridden in exception subclasses ... x, y = inst.args # unpack args ... print('x =', x) ... print('y =', y) ... ('spam', 'eggs') x = spam y = eggs

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网络推广 https://www.feimao666.com

  • 上一篇:设计模式之-建造者模式(Builder)
  • 下一篇:最后一页
  •