Python的异常处理机制

1.错误和异常

错误   指的是代码的语法或者逻辑有错误

异常  指的是 由错误引起的,当出现错误,python解释器就无法处理程序,报出异常

出现异常,程序终止执行,如果不加以处理(异常捕捉),就会出现所谓的traceback 回溯 终止程序

2.python的异常处理

使用 python 异常处理机制,遇见异常,不会抛出不友好的traceback,而是有except决定抛出的信息

python的错误处理机制让你能够细致的控制与用户分享错误信息的程度,要分享多少信息由你决定。

1.try/except

def main():
    a=3/0
    print(a)
try:
    main()
except ZeroDivisionError:
    print("error")
 

 try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理,如果没有try/except,程序发生错误会终止运行,且抛出不友好的traceback,有了该语句,try语句发生错误,只会打印出“error”提示。

except捕捉 ZeroDivisionError 异常,也可以捕捉多种异常  except(Exception1[, Exception2[,...ExceptionN]]]):

except也可以不带任何异常类型,意味着只要try有错,就执行except后面的语句,但这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,因为它捕获所有的异常。

def main():
    a=3/0
    print(a)
try:
    main()
except:
    print("error")
 

 2.try/except/else/finally

def main():
    a=3/1
    print(a)
try:
    main()
except ZeroDivisionError:
    print("error")
else:
    print(main())
finally:
    print("always do this")

try语句内容有错,执行except语句,没有错误,执行else语句

3. 抛出异常 raise

python使用raise 语句 抛出一个指定的异常

raise NameError(“hello”)

有了raise 语句 就有异常,不管程序有没有异常,raise出现的地方就是异常 

def is_work_done():
    a=3/1
    return a

try:
    is_work_done()
    raise NameError("HELLO")
except:
    print("hello")
    raise  #raise的唯一参数是异常的类或者实例(也就是exception的子类)
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。

 4 . 自定义异常类型

你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,例如:

class MyError(Exception):
    def __init__(self,value):
        super().__init__() 
        self.value=value
try:
    raise MyError(9)
except MyError as e:
    print(e.value)

5. Exception 和 BaseException区别

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration...
      +-- StandardError...
      +-- Warning...

可以看出  BaseException 是最最基础的异常类,Exception 继承他,BaseException除了包含所有的Exception外还包含了SystemExitKeyboardInterruptGeneratorExit三个异常。这三个高级异常很少使用,我们在处理常见异常,只需要基于Exception即可。

6.  except Exception as e和 except Exception, e

两者意思相同 第一种写法推荐使用,第二种 python3 不支持

7. 常见的异常类型

  描述
BaseError 所有异常的基类
SystemExit 解释器请求退出
KeyBoardInterrupt 用户中断执行(ctrl+c)
Exception 常规错误的基类
AssertionError 断句错误,当assert关键字后面的条件为假时,程序就会抛出
FileNotFoundError 文件不存在
AttributeError 属性错误,对象属性不存在的时候
IndexError 索引错误,索引超出范围
KeyError 在字典中查找一个不存在的关键字
NameError 尝试访问一个不存在的变量
SyntaxError 语法错误
TypeError 类型错误,不同类型间的无效操作,1+“1”
ZeroDivisionError 除0错误,分母为0
EOFError 没有内建输入,到达EOF标记
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
RuntimeError 一般的运行时错误
IndentationError 缩进错误
SystemError 一般的解释器错误
TabError

Tab和空格混用

Warning

所有警告的基类

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8. 注意事项

  1. 只处理你知道的异常,避免捕获所有异常然后吞掉它们。
  2. 抛出的异常应该说明原因
  3. 如果有需要,切记使用finally来释放资源
  4. 如果有需要,请不要忘记在处理异常后做清理工作或者回滚操作

 

posted @ 2019-07-14 22:21  小小慧程序媛  阅读(4323)  评论(0编辑  收藏  举报