Python学习之异常处理

1.首先了解错误和异常的概念:

错误:代码运行前的代码错误或者是程序执行过程中的逻辑错误
1:语法错误:代码不符合解释器或者编译器语法(代码错误)
2:逻辑错误:不完整或者不合法输入或者计算出现问题(输入时或者计算时,比如除零操作等)
异常:执行过程中出现问题导致程序无法继续执行
1:程序遇到逻辑或者算法问题(代码错误导致程序无法正确的执行)
2:运行过程中计算机错误(内存不够或者IO错误)(硬件环境出现问题)

2.错误和异常的区别:

  错误中的语法错误会在解释器或编译发现的,但是逻辑错误是无法通过解释其或编译器来预判的,而在程序执行的过程中,如果出现错误,编译器或解释器检查到错误就认为是异常,则会抛出异常;而异常的处理有截获、忽略、终止程序,一般如果我们没有人为的对异常进行截获的话,异常就会终止程序的运行

3.Python常见的错误:

  1、NameError 变量没定义就使用
  2、SyntaxError 语法错误
  3、IOError 打开一个不存在的目录或文件 
  4.ZeroDivisionError  10/0 除数为0了  逻辑错误
  5.a=int('dd') :ValueError 传入值无效
  6.KeyboardInterrupt  强制终止程序产生,比如按下Ctrl+C
7.IndentionError:缩进问题

4.工作原理

  1.首先执行try中的语句

  2.如果没有发生异常,则忽略except,执行完try的语句

  3.如果发生ic行,那么会暂时或略try中发生异常后的语句,如果发生异常的类型与except后的名称相符,则执行except后的语句,然后再执行try中未执行的语句。

  4.如果发生异常,但无任何except匹配,、那么这个异常就会往上传递给上层的try,直到找不到就会停止程序的执行。

5.常用的几种方式:

  1.try .... finally 

try:
    pass
finally:
    #如果没有捕获到异常,该代码库执行
    #如果捕获到异常,先执行这个,再给解释器处理异常
    #总之,如何都要执行这里面的语句

  2.try ... except ... finally

try:
    pass 
except:
    #异常处理
finally:
    #必须要做的事

#1)如果没有捕获到异常,执行完try后就执行finally
#2)如果捕获到异常,try=》except=》try中未执行完的语句=》finally
#3)else与finally的区别是,else是没有捕获到异常时才执行的,而finally是不管怎样都会执行的

  3.try .... except ... else

try:
    pass 
except: 
    #异常处理
else:
    #未捕获到异常时要执行的语句

 

traceback相关:

python中用于处理异常栈的模块是traceback模块,它提供了print_exception、format_exception等输出异常栈等常用的工具函数。

其实traceback.print_exc()函数只是traceback.print_exception()函数的一个简写形式,traceback.format_exc()函数是traceback.format_exception()的一个简写形式。而它们获取异常相关的数据都是通过sys.exc_info()函数得到的。

sys.exc_info()返回的值是一个元组,分别是,exc_type是异常的对象类型,exc_value是异常的值,exc_tb是一个traceback对象,对象中包含出错的行数、位置等数据。然后通过print_exception函数对这些异常数据进行整理输出

def func(a, b):
    return a / b
if __name__ == '__main__':
    import sys
    import traceback
    try:
        func(1, 0)
    except Exception as e:
        print "print_exception()"
        exc_type, exc_value, exc_tb = sys.exc_info()
        print 'the exc type is:', exc_type
        print 'the exc value is:', exc_value
        print 'the exc tb is:', exc_tb
        traceback.print_exception(exc_type, exc_value, exc_tb)

 

posted @ 2017-11-15 00:05  fireporsche  阅读(324)  评论(0编辑  收藏  举报