python异常处理

错误和异常

错误---->

  • 语法错误: 自己造孽, 写错代码! 错误也是一种异常;
  • 逻辑错误: 程序运行中, 在某些特定条件下, 不合适的数据引起程序出现错误导致程序崩溃。
>>> 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
常见的异常:


常见异常

你可能感兴趣的:(python异常处理)