Python开发【2.2 异常处理】
1、Python常见异常类型:
Exception 常规错误的基类 AttributeError 对象没有这个属性 IOError 输入/输出操作失败 IndexError 序列中没有此索引(index) KeyError 映射中没有这个键 NameError 未声明/初始化对象 (没有属性) SyntaxError Python 语法错误 TypeError 对类型无效的操作 ValueError 传入无效的参数 ZeroDivisionError 除(或取模)零 (所有数据类型)
2、异常处理
无异常处理时,出现异常会终止程序执行,增加异常处理的代码,程序会执行到最后
print("start.....") try: x = int(input("Please enter a number: ")) print("number:",x) print("ok....") except ValueError: print("Oops! That was no valid number. Try again") print("end.....")
try语句工作方式:
1.首先,执行try子句(在关键字try和关键字except之间的语句) 2.如果没有异常发生,忽略except子句,try子句执行后结束。 3.如果执行try子句的过程中发生异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。
最后执行 try 语句之后的代码。 4.如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。 5.一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组:
except (RuntimeError, TypeError, NameError): pass
最后一个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
3、抛出异常(自行抛出异常)
Python 使用 raise 语句抛出一个指定的异常
>>> raise NameError('HiThere') Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: HiThere
raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。
>>> try: raise NameError('HiThere') except NameError: print('An exception flew by!') raise An exception flew by! Traceback (most recent call last): File "<stdin>", line 2, in ? NameError: HiThere