异常的种类

  1. AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
  2. IOError 输入/输出异常;基本上是无法打开文件
  3. ImportError 无法引入模块或包;基本上是路径问题或名称错误
  4. IndentationError 语法错误(的子类) ;代码没有正确对齐
  5. IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
  6. KeyError 试图访问字典里不存在的键
  7. KeyboardInterrupt Ctrl+C被按下
  8. NameError 使用一个还未被赋予对象的变量
  9. SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
  10. TypeError 传入对象类型与要求的不符合
  11. UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
  12. 导致你以为正在访问它
  13. ValueError 传入一个调用者不期望的值,即使值的类型是正确的

常用异常

  1. ArithmeticError
  2. AssertionError
  3. AttributeError
  4. BaseException
  5. BufferError
  6. BytesWarning
  7. DeprecationWarning
  8. EnvironmentError
  9. EOFError
  10. Exception
  11. FloatingPointError
  12. FutureWarning
  13. GeneratorExit
  14. ImportError
  15. ImportWarning
  16. IndentationError
  17. IndexError
  18. IOError
  19. KeyboardInterrupt
  20. KeyError
  21. LookupError
  22. MemoryError
  23. NameError
  24. NotImplementedError
  25. OSError
  26. OverflowError
  27. PendingDeprecationWarning
  28. ReferenceError
  29. RuntimeError
  30. RuntimeWarning
  31. StandardError
  32. StopIteration
  33. SyntaxError
  34. SyntaxWarning
  35. SystemError
  36. SystemExit
  37. TabError
  38. TypeError
  39. UnboundLocalError
  40. UnicodeDecodeError
  41. UnicodeEncodeError
  42. UnicodeError
  43. UnicodeTranslateError
  44. UnicodeWarning
  45. UserWarning
  46. ValueError
  47. Warning
  48. ZeroDivisionError

更多异常

异常处理

异常语法

  1. # python3语法
  2. try:
  3. pass
  4. except Exception as e:
  5. pass
  6.  
  7. # python2语法
  8. try:
  9. pass
  10. except Exception,e:
  11. pass

一般语法  try...except as e...

  1. s1 = 'hello'
  2. try:
  3. int(s1)
  4. except IndexError as e:
  5. print(e)
  6. except KeyError as e:
  7. print(e)
  8. except ValueError as e:
  9. print(e)

多分支异常  try...except as e...except as e...

  1. try:
  2. pass
  3. except:
  4. pass
  5.  
  6. try:
  7. pass
  8. except Exception as e:
  9. print(e)
  10.  
  11. try:
  12. pass
  13. except ValueError as e:
  14. pass
  15. except IndexError as e:
  16. pass
  17. except Exception as e:
  18. pass

万能异常 try...except...

  1. try:
  2. print("try")
  3. except KeyError as e:
  4. # 异常时,执行该块
  5. pass
  6. else:
  7. # 主代码块执行完,执行该块
  8. print("else")
  9. finally:
  10. # 无论异常与否,最终执行该块
  11. print("finally")
  12.  
  13. """
  14. try
  15. else
  16. finally
  17. """
  18.  
  19. try:
  20. print("try")
  21. raise KeyError
  22. except KeyError as e:
  23. # 异常时,执行该块
  24. print("KeyError")
  25. else:
  26. # 主代码块执行完,执行该块
  27. print("else")
  28. finally:
  29. # 无论异常与否,最终执行该块
  30. print("finally")
  31.  
  32. """
  33. try
  34. KeyError
  35. finally
  36. """

try...except...else...finally

  1. try:
  2. raise Exception('错误了。。。')
  3. except Exception as e:
  4. print(e)
  5.  
  6. """
  7. 错误了。。。
  8. """

主动触发异常

  1. class MyException(Exception):
  2.  
  3. def __init__(self, msg):
  4. self.message = msg
  5.  
  6. def __str__(self):
  7. return self.message
  8.  
  9. try:
  10. raise MyException('我的异常')
  11. except MyException as e:
  12. print(e)

自定义异常

断言 assert

  1. assert 1 == 1
  2. # True,则执行后面代码
  3.  
  4. assert 1 == 2 # 报错
  5. """
  6. Traceback (most recent call last):
  7. File "D:/Python相关/test.py", line 6, in <module>
  8. assert 1 == 2
  9. AssertionError
  10. """
  11.  
  12. try:
  13. assert 1 == 2
  14. except AssertionError as e:
  15. print("AssertionError")
  16.  
  17. 断言 assert

断言 assert

异常跟踪

traceback模块

  1. # 一般的异常处理
  2. try:
  3. 1 / 0
  4. except Exception as e:
  5. print(e)
  6. # division by zero
  7.  
  8. # 配合traceback进行异常跟踪
  9. import traceback
  10. try:
  11. 1 / 0
  12. except Exception as e:
  13. # traceback.print_exc() # 打印出来,无返回值,效果等于print(traceback.format_exc())
  14. res = traceback.format_exc()
  15. print(res)
  16.  
  17. """
  18. Traceback (most recent call last):
  19. File "D:/Python相关/项目/interview/test3.py", line 44, in <module>
  20. 1 / 0
  21. ZeroDivisionError: division by zero
  22. """
  23.  
  24. """
  25. traceback.print_exc()跟traceback.format_exc()有什么区别呢?
  26. traceback.print_exc()与print traceback.format_exc()效果是一样的。
  27. format_exc()返回字符串
  28. print_exc()则直接给打印出来。
  29. print_exc()还可以接受file参数直接写入到一个文件。比如traceback.print_exc(file=open('tb.txt','w+'))写入到tb.txt文件去。
  30. """

traceback简单使用

  1. def func(a, b):
  2. return a / b
  3.  
  4. if __name__ == '__main__':
  5. import sys
  6. import traceback
  7.  
  8. try:
  9. func(1, 0)
  10. except Exception as e:
  11. print("print_exception()")
  12. exc_type, exc_value, exc_tb = sys.exc_info()
  13. print('the exc type is:', exc_type)
  14. print('the exc value is:', exc_value)
  15. print('the exc tb is:', exc_tb)
  16. traceback.print_exception(exc_type, exc_value, exc_tb)

traceback简单使用2

使用cgitb来简化异常调试

如果平时开发喜欢基于log的方式来调试,那么可能经常去做这样的事情,在log里面发现异常之后,因为信息不足,那么会再去额外加一些debug log来把相关变量的值输出。调试完毕之后再把这些debug log去掉。其实没必要这么麻烦,Python库中提供了cgitb模块来帮助做这些事情,它能够输出异常上下文所有相关变量的信息,不必每次自己再去手动加debug log。

cgitb的使用简单的不能想象:

  1. def func(a, b):
  2. return a / b
  3.  
  4. if __name__ == '__main__':
  5. import cgitb
  6.  
  7. cgitb.enable(format='text')
  8.  
  9. func(1, 0)
  10.  
  11. """
  12. A problem occurred in a Python script. Here is the sequence of
  13. function calls leading up to the error, in the order they occurred.
  14.  
  15. /Users/samchi/Documents/workspace/tracebacktest/teststacktrace.py in <module>()
  16. 4 import cgitb
  17. 5 cgitb.enable(format='text')
  18. 6 import sys
  19. 7 import traceback
  20. 8 func(1, 0)
  21. func = <function func>
  22.  
  23. /Users/samchi/Documents/workspace/tracebacktest/teststacktrace.py in func(a=1, b=0)
  24. 2 return a / b
  25. 3 if __name__ == '__main__':
  26. 4 import cgitb
  27. 5 cgitb.enable(format='text')
  28. 6 import sys
  29. a = 1
  30. b = 0
  31. """

cgitb,覆盖了默认的sys.excepthook函数

完全不必再去log.debug("a=%d" % a)了,个人感觉cgitb在线上环境不适合使用,适合在开发的过程中进行调试,非常的方便。

也许你会问,cgitb为什么会这么屌?能获取这么详细的出错信息?其实它的工作原理同它的使用方式一样的简单,它只是覆盖了默认的sys.excepthook函数,sys.excepthook是一个默认的全局异常拦截器,可以尝试去自行对它修改:

  1. def func(a, b):
  2. return a / b
  3.  
  4. def my_exception_handler(exc_type, exc_value, exc_tb):
  5. print("i caught the exception:", exc_type)
  6. while exc_tb:
  7. print("the line no:", exc_tb.tb_lineno)
  8. print("the frame locals:", exc_tb.tb_frame.f_locals)
  9. exc_tb = exc_tb.tb_next
  10.  
  11. if __name__ == '__main__':
  12. import sys
  13.  
  14. sys.excepthook = my_exception_handler
  15. import traceback
  16.  
  17. func(1, 0)
  18.  
  19. """
  20. i caught the exception: <class 'ZeroDivisionError'>
  21. the line no: 35
  22. the frame locals: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x02FDB410>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/Python相关/项目/interview/test2.py', '__cached__': None, 'func': <function func at 0x0304B810>, 'my_exception_handler': <function my_exception_handler at 0x04C70618>, 'sys': <module 'sys' (built-in)>, 'traceback': <module 'traceback' from 'C:\\Python\\Python36\\lib\\traceback.py'>}
  23. the line no: 18
  24. the frame locals: {'b': 0, 'a': 1}
  25. """

sys.excepthook是一个默认的全局异常拦截器

使用logging模块来记录异常

  1. import logging
  2.  
  3. try:
  4. 1 / 0
  5. except Exception as e:
  6. logging.exception(e)
  7. logging.error(e, exc_info=1) # 指名输出栈踪迹, logging.exception的内部也是包了一层此做法
  8. logging.critical(e, exc_info=1) # 更加严重的错误级别
  9.  
  10. """
  11. ERROR:root:division by zero
  12. Traceback (most recent call last):
  13. File "D:/Python相关/项目/interview/test2.py", line 20, in <module>
  14. 1 / 0
  15. ZeroDivisionError: division by zero
  16. ERROR:root:division by zero
  17. Traceback (most recent call last):
  18. File "D:/Python相关/项目/interview/test2.py", line 20, in <module>
  19. 1 / 0
  20. ZeroDivisionError: division by zero
  21. CRITICAL:root:division by zero
  22. Traceback (most recent call last):
  23. File "D:/Python相关/项目/interview/test2.py", line 20, in <module>
  24. 1 / 0
  25. ZeroDivisionError: division by zero
  26. """

使用logging模块来记录异常

参考or转发

http://www.cnblogs.com/wupeiqi/articles/5017742.html

https://blog.csdn.net/lengxingxing_/article/details/56317838

Python基础_异常处理与跟踪的更多相关文章

  1. Python 基础之 异常处理

    python 基础之异常处理 说到异常处理,就得先问一下,什么是异常处理?  先来看一下,什么是异常? 异常就是:程序运行时发出的错误的信号. 异常的种类先来看一下: 一.常见的异常 Attribut ...

  2. python基础_格式化输出(%用法和format用法)(转载)

    python基础_格式化输出(%用法和format用法) 目录 %用法 format用法 %用法 1.整数的输出 %o -- oct 八进制%d -- dec 十进制%x -- hex 十六进制 &g ...

  3. Python基础_文件的的处理及异常处理

    今天主要讲讲文件读写及异常处理. 一.文件操作 1.1 文件的创建及读 打开文件 open 函数  open(file,[option]) file 是要打开的文件 option是可选择的参数文件的打 ...

  4. python基础之异常处理

    Python3 错误和异常 作为Python初学者,在刚学习Python编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍. Python有两种错误很容易辨认:语法错误和异常. ...

  5. python基础_面向对象进阶

    @property装饰器 之前我们讨论过Python中属性和方法访问权限的问题,虽然我们不建议将属性设置为私有的,但是如果直接将属性暴露给外界也是有问题的,比如我们没有办法检查赋给属性的值是否有效.我 ...

  6. Python基础、异常处理

    一.概述 错误与异常概念 异常也是对象, 基于Exception类.内置异常 异常处理.流程 try/except/else  处理python或你触发的异常 try/fianlly   不管有没有异 ...

  7. python基础_字典_列表_元组考试_day4

    1.请用代码实现:利用下划线将列表的每一个元素拼接成字符串,li=['alex','eric','rain'] li=['alex','eric','rain'] v="_".jo ...

  8. Python基础_列表 list

    列表是Python的一种基础数据类型,可以进行的操作包括索引,切片,加,乘,检查成员 列表定义: list(列表.数组) eg:stus=['lisi','jion','peter'] #下标:即角标 ...

  9. python基础_格式化输出(%用法和format用法)

      目录 %用法 format用法 %用法 1.整数的输出 %o —— oct 八进制%d —— dec 十进制%x —— hex 十六进制 1 >>> print('%o' % 2 ...

随机推荐

  1. 【js】按下enter键禁止表单自动提交

    //enter键盘事件 document.onkeypress=function(){ if(event.keyCode==13){ return false; } }

  2. 【vue知识点】2)vue登录认证

    要点: 客户端登录要唯一 ——> token除了客户端要验证外,服务器端也要校验  (处理:token应该包含用户的基本信息,这样服务端解密token的时候就知道是哪个账户) (如果只是使用to ...

  3. libmxml数据结构(源码分析)

    libmxml是一个开源.小巧的C语言xml库.这里简单分析一下它是用什么样的数据结构来保存分析过的xml文档. mxml关键的结构体mxml_node_t是这样的实现的: struct mxml_n ...

  4. 1025 反转链表(链表,reverse)

    题目: 给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4:如果 K 为 4,则 ...

  5. MySQL日期时间处理函数

    -- MySQL日期时间处理函数SELECT NOW() FROM DUAL;-- 当前日期时间:2017-05-12 11:41:47-- 在MySQL里也存在和Oracle里类似的dual虚拟表: ...

  6. Win10 安装 MongoDB 3.6.5 失败的问题

    MongoDB 3.6.5 2008R2Plus SSL (64 bit) Setup Wizard ended prematurely 在安装 MongoDB 的时候,出现了MongoDB 3.6. ...

  7. Lua 语言学习

    详细讲解见菜鸟教程 Lua. 一.数据类型 -- 直接输出 print("hello") -- 全局变量 b = print(b) -- nil(空) print(type(a)) ...

  8. react fake double , bind click and dblclick on the same element

    smartClick:function(id,name,waiter,e){ var desk = $$(e.currentTarget).data('raw'); if(this.lastClick ...

  9. WP10的一点小问题

    兼容WP8.0/WP7.5不太完整!也许是测试版的问题.毕竟还没发布正式版! 具体如:WP8.0或WP7.5的启动器!就是选择图片的启动器!调用后对话框返回的结果都是Cancel本来应该是OK的.也就 ...

  10. JavaEE笔记(六)

    实现Action的几种方法1. implements Action2. extends ActionSupport3. 也可以不继承任何父类不实现任何借口 #当一个类有多个方法 package com ...