错误和异常
错误---->
- 语法错误: 自己造孽, 写错代码! 错误也是一种异常;
- 逻辑错误: 程序运行中, 在某些特定条件下, 不合适的数据引起程序出现错误导致程序崩溃。
>>> c = int(input("请输入数据"))
请输入数据a
Traceback (most recent call last):
File "", line 1, in
ValueError: invalid literal for int() with base 10: 'a'
异常----> 执行过程中出现的问题导致程序无法正常执行
- 程序遇到算法或逻辑问题
-
运行过程中计算机出现问题(内存不足, 或I/O错误)
为什么要处理异常
当程序在运行过程中,由于用户的误操作或者不合适的数据引发的程序错误,让代码自己处理并保证程序的正常执行。而不至于因为错误导致程序崩溃!提高代码的健壮性!
异常处理方法
- 捕获异常
- 断言处理异常[测试异常信息]
语法
try # 尝试, 将可能出现的异常的代码, 包含在try中
except # 一旦出现异常, 代码就会直接从出现异常的地方跳转到except中执行
else # 如果try中的代码执行没有异常, 执行完毕后, 就会执行else中的代码
finally # 不会是否出现异常, 都要在try中执行完成之后执行的代码
try:
print('try...')
r = 10/0
print('result:', r)
except ZeroDivisionError as e:
print('except:', e)
finally:
print("finally...")
print("END")
------------------------------------
try...
except: division by zero
finally...
END
当我们认为某些代码可能会出错时, 就可以用try来运行这段代码,如果执行出错, 则后续代码不会继续执行, 而是直接跳转至错误处理代码, 即except语句模块, 执行完except后,如果有finally语句块, 则执行finally语句块, 至此, 执行完毕。
处理多个异常
错误可能有多种,使用不同的except语句块处理。
try:
print('try...')
r = 10/int('a')
print('result:', r)
except ValueError as e:
print('ValueError:', e)
except ZeroDivisionError as e:
print('ZeroDivisionError:', e)
finally:
print('finally...')
print('END')
------------------------------------------
try...
ValueError: invalid literal for int() with base 10: 'a'
finally...
END
使用else
try:
print('try...')
r = 10/int('2')
print('result:', r)
except ValueError as e:
print('ValueError:', e)
except ZeroDivisionError as e:
print('ZeroDivisionError:', e)
else:
print("no error")
finally:
print('finally...')
print('END')
--------------------------------------
try...
result: 5.0
no error
finally...
END
捕获异常的好处
可以跨越多层调用, 比如main()调用foo(), foo()调用bar(), 结果bar()出错了, 这时, 只要main()捕获到了, 就可以处理:
def foo(s):
return 10/int(s)
def bar(s):
return foo(s)*2
def main():
try:
bar('0')
except Exception as e:
print('Error:', e)
finally:
print('finally...')
main()
--------------------------------------
Error: division by zero
finally...
也就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。这样一来,就大大减少了写try...except...finally的麻烦。
自定义异常
首先-代码执行过程中,出现了异常【系统标准异常】【信息不是很明白】
捕获系统异常,创建一个自定义异常
抛出自定义异常【自定义异常】【信息明确的错误】
自定义异常的目的:转换异常信息,将不明确的异常信息转换成更加精确的异常信息
转换异常信息:异常的传递~传递更加明确的异常,给后面的代码进行处理!
主动抛出异常
在开发过程中, 主动出现的一种错误, 将错误抛出给程序。
通过raise关键字, 抛出一个异常
断言处理异常(调试)
断言是一句必须等价于布尔真的判定;此外,发生异常也意味着表达式为假.这些工作类似于 C 语言预处理器中 assert 宏,但在 Python 中它们在运行时构建(与之相对的是编译期判别).
如果刚刚接触断言这个概念,无妨.断言可以简简单单的想象为 raise-if 语句(更准确的说是raise-if-not 语句).测试一个表达式,如果返回值是假,触发异常.
断言语句等价于这样的 Python 表达式,如果断言成功不采取任何措施(类似语句),否则触发AssertionError(断言错误)的异常.assert 的语法如下:
assert expression[, arguments]
Python中何时使用断言
凡是用print()来辅助查看的地方, 都可以用断言来替代
def foo(s):
n = int(s)
assert n != 0, 'n is zero'
return 10/n
def main():
foo('0')
main()
----------------------------------------
Traceback (most recent call last):
File "异常.py", line 61, in
main()
File "异常.py", line 59, in main
foo('0')
File "异常.py", line 55, in foo
assert n != 0, 'n is zero'
AssertionError: n is zero
assert的意思是, 表达式n != 0应该是True,否则, 根据程序运行的逻辑, 后面的代码肯定出错。
如果断言失败, assert会抛出AssertionError
参考博客:http://blog.csdn.net/pipisorry/article/details/21841883
常见的异常
所有异常的超类: BaseException
标准异常的超类: Exception
常见的异常: