Python3.7错误和异常
Python有两种错误很容易辨认:语法错误和异常。
Python常见异常总结:
异常 | 描述 |
---|---|
AssertionError | 断言语句(assert)失败 |
AttributeError | 尝试访问未知的对象属性 |
ImportError | 导入模块失败 |
IndexError | 索引超出序列范围 |
KeyError | 字典中查找一个不存在的关键字 |
MemoryError | 内存溢出,可通过删除对象释放内存 |
NameError | 尝试访问一个不存在的变量 |
OSError | 操作系统产生的异常(如打开一个不存在的文件) |
OverflowError | 数值运算超出最大限制 |
SyntaxError | 语法错误 |
TypeError | 不同类型间的无效操作 |
ValueError | 传入无效的参数 |
ZeroDivisionError | 除数为零 |
异常处理
(1)try-except语句
语法:
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
try语句按照如下方式工作:
- 首先,执行try语句(在关键字try与关键字except之间的语句)
- 如果无异常发生,忽略except子句,try子句执行后结束
- 如果在执行try子句的过程中,发生了异常,那么try子句余下的部分将被忽略。如果异常类型和except之后的名称相符,那么对应的except子句将被执行。最后执行try子句余下部分的代码
- 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中
example1:
try:
a=10/0
print(a)
except ZeroDivisionError :
print('除数不能为零')
结果:
除数不能为零
example2:
try:
a=10/0
print(a)
except ZeroDivisionError as error:
print('运算错误\n原因是:',str(error))
结果:
运算错误
原因是: division by zero
-
一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。如下:
try: int("abc") s = 1 + '1' f = open('test.txt') print(f.read()) f.close() except OSError as error: print('打开文件出错\n原因是:' + str(error)) except TypeError as error: print('类型出错\n原因是:' + str(error)) except ValueError as error: print('数值出错\n原因是:' + str(error)) 结果: 数值出错 原因是:invalid literal for int() with base 10: 'apple' #最多执行一个分支
-
一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。仍是最多只有一个分支会被执行。如下:
try: s = 1 + '1' int('apple') f = open('test.txt') print(f.read()) f.close() except (OSError, TypeError, ValueError) as error: print('出错了!\n原因是:' + str(error)) 结果: 出错了! 原因是:unsupported operand type(s) for +: 'int' and 'str'
(2)try-except-finally语句
语法:
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
finally:
无论如何都会被执行的语句
不管try子句里面有没有发生异常,finally子句都会被执行。
如果一个异常在try子句里被抛出,而又没有任何的except把它截住,那么这个异常会在finally子句执行后被抛出。如:
def divide(x, y):
try:
result = x / y
print("result is", result)
except ZeroDivisionError:
print("division by zero!")
finally:
print("executing finally clause")
divide(2,1)
divide(2,0)
divide('a','b')
结果:
result is 2.0
executing finally clause # divide(2,1)
division by zero!
executing finally clause # divide(2,0)
executing finally clause
TypeError: unsupported operand type(s) for /: 'str' and 'str' # divide('a','b')
(3)raise语句
Python使用raise语句抛出一个指定异常
try:
raise NameError('problem here')
except NameError:
print('这是一个指定异常!')
结果:
这是一个指定异常!