异常捕获

try

基本概念

我们使用try except来捕获异常,python的try except有几个特点:

  • 不管函数内部嵌套几层,只要在try的范围内就可以被捕获。这句话的意思是一个函数被try语句包裹,这个函数中调用了另一个函数。如果被调用函数中发生了异常,那么在外层的函数中是可以被捕获到的;

特点

  • try except finally的执行逻辑是

    ** 正常逻辑是try -》finally

    ** 错误逻辑是try -》except -》finally

except

基本概念

except中有各种类型的异常,其中基类是BaseException。具体可以参考:https://docs.python.org/3/library/exceptions.html#exception-hierarchy

BaseException

+-- SystemExit

+-- KeyboardInterrupt

+-- GeneratorExit

+-- Exception

+-- StopIteration

+-- StopAsyncIteration

+-- ArithmeticError

| +-- FloatingPointError

| +-- OverflowError

| +-- ZeroDivisionError

+-- AssertionError

+-- AttributeError

+-- BufferError

+-- EOFError

+-- ImportError

+-- ModuleNotFoundError

+-- LookupError

| +-- IndexError

| +-- KeyError

+-- MemoryError

+-- NameError

| +-- UnboundLocalError

+-- OSError

| +-- BlockingIOError

| +-- ChildProcessError

| +-- ConnectionError

| | +-- BrokenPipeError

| | +-- ConnectionAbortedError

| | +-- ConnectionRefusedError

| | +-- ConnectionResetError

| +-- FileExistsError

| +-- FileNotFoundError

| +-- InterruptedError

| +-- IsADirectoryError

| +-- NotADirectoryError

| +-- PermissionError

| +-- ProcessLookupError

| +-- TimeoutError

+-- ReferenceError

+-- RuntimeError

| +-- NotImplementedError

| +-- RecursionError

+-- SyntaxError

| +-- IndentationError

| +-- TabError

+-- SystemError

+-- TypeError

+-- ValueError

| +-- UnicodeError

| +-- UnicodeDecodeError

| +-- UnicodeEncodeError

| +-- UnicodeTranslateError

+-- Warning

+-- DeprecationWarning

+-- PendingDeprecationWarning

+-- RuntimeWarning

+-- SyntaxWarning

+-- UserWarning

+-- FutureWarning

+-- ImportWarning

+-- UnicodeWarning

+-- BytesWarning

+-- ResourceWarning


特点

异常的特点有:

  • 父类的异常捕获到,其后如果有子类也捕获异常,那么子类的异常捕获是失效的
  • 堆栈是按照顺序抛出异常的,在出错的时候可以顺着异常堆栈排查
'a demo class of except'

__author__ = 'liyue'

class  MyExceptionTest:
#通过try except finally处理异常
def fun1(self):
try:
print('begin to calc 10/0:')
i = 10/0
print('calc successful')
except ZeroDivisionError as e:
print('ValueError:', e)
finally:
print('calc finally') #父类捕获异常,子类无效
def fun2(self):
try:
print('begin to calc 10/0:')
i = 10/0
print('calc successful') except BaseException as be:
print('This is BaseException :%s' % be)
except ZeroDivisionError as e:
print('This is ValueError:%s' % e) finally:
print('calc finally') if __name__ == '__main__':
m = MyExceptionTest()
m.fun1()
m.fun2()

记录异常

  • 记录异常可以用python內建logging模块,通过配置可以把logging信息记录到日志中。
  • 如果有logging,异常打印后,logging记录完后会继续执行完后续代码
#logging记录异常
def fun3(self):
try:
print('fun3:')
print('begin to calc 10/0:')
i = 10/0
print('calc successful')
except ZeroDivisionError as e:
logging.exception(e)
finally:
print('3 calc finally')

抛出错误

我们使用raise来抛出错误,特点有:

  • 可以自定义抛出,但是前提是没有內建异常,或者实际需要
  • 可以在except中把适当的exception转换为另一个种抛出,前提是这种转换合理的
'a demo class of except'
__author__ = 'liyue' import logging class MyError(ValueError):
pass class MyExceptionTest:
#通过try except finally处理异常
def fun1(self, n):
if n==0:
raise MyError('This is my error')
return 10/n if __name__ == '__main__':
m = MyExceptionTest()
m.fun1(0)

调试

print()

print()方法是最常见的调试,在调试中直接打印信息,但是需要每次编码,且最终使用中不方便

assert()

断言也是一种通用的调试方法,但是不友好。使用也不方便

pdb

调试需要配置环境和下载pdb,开发阶段配置好可用,但是不具有通用性。

logging

日志是最有效最通用的方式,既可以调试也可以在非调试环境下使用。

日志的配置有多种形式,api里有说明。这里取了最常用的。多模块可配置打印:

'a demo class of except'
__author__ = 'liyue' import logging
#logging.basicConfig(filename='d:\example.log',level=logging.DEBUG) #简单的打印
#常见的通用打印,包含了输出路径、输出名称、级别、时间和信息
logging.basicConfig(filename='d:\example.log', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') class MyDebug(object): def assertTest(self, n):
if n == 0:
assert() def logTest(self, msg):
#这两句是单模块打印时候使用,如果设计中不需要模块信息输出也可以直接这样使用
#logging.info(msg)
#logging.debug(msg) #更为通用的多模块打印,是常见的打印模式
logger = logging.getLogger('ly demo')
logger.warning(msg) if __name__ == '__main__':
m = MyDebug()
#m.assertTest(0)
m.logTest('This is a test log info')
m.logTest('print some infomation')

Python异常和调试.md的更多相关文章

  1. python 异常

    引用一段来自菜鸟教程的文章:http://www.runoob.com/python/python-exceptions.html Python 异常处理 python提供了两个非常重要的功能来处理p ...

  2. 小学生绞尽脑汁也学不会的python(异常,约束,MD5加密,日志处理)

    小学生绞尽脑汁也学不会的python(异常,约束,MD5加密,日志处理) 异常处理(处理) 1.产生异常.raise 异常类(),抛出异常2. 处理异常: try: xxxxx # 尝试执行的代码. ...

  3. 【AMAD】stackprint -- 为Python加入利于调试的traceback信息

    简介 动机 作用 用法 热度分析 源码分析 个人评分 简介 为Python加入利于调试的traceback信息.  动机 Python抛出异常时,会显示一些traceback信息.但是,一些时候这些 ...

  4. [转] python程序的调试方法

    qi09 原文 python程序的调试方法 本文讨论在没有方便的IDE工具可用的情况下,使用pdb调试python程序 源码例子 例如,有模拟税收计算的程序: #!/usr/bin/python de ...

  5. [置顶] 如何在Python IDLE中调试Python代码?

    好久没有用Python了,居然忘记了怎么在Python IDLE中调试Python代码.百度了一下,然后还是写下来吧,以免以后又忘记了. 1. Set break point in the sourc ...

  6. #21 Python异常

    前言 运行程序时经常遇到各种错误,例如:ImportError(导入模块错误).IndexError(索引错误).NameError(变量错误).SyntaxError(语法错误).Indentati ...

  7. Python异常和异常处理

    Python异常和异常处理2017年12月20日 22:17:08 Megustas_JJC 阅读数:114 标签: python 异常处理 更多 个人分类: Python 版权声明:本文为博主原创文 ...

  8. python——异常except语句用法与引发异常

    except: #捕获所有异常 except: <异常名>: #捕获指定异常 except:<异常名1,异常名2):捕获异常1或者异常2 except:<异常名>,< ...

  9. 笔记-python异常信息输出

    笔记-python异常信息输出 1.      异常信息输出 python异常捕获使用try-except-else-finally语句: 在except 语句中可以使用except as e,然后通 ...

随机推荐

  1. [SQL]SQL Prompt5的工具栏按钮介绍

    这是SQL Prompt5的工具栏按钮 Refresh Suggestions 刷新提示(数据库更改表结构后,需要刷新一下) Format SQL 格式化代码(Pro版本才能启用,可定制,所有前边带红 ...

  2. module 'pip' has no attribute 'pep425tags'

    AMD64 import pip._internal print(pip._internal.pep425tags.get_supported()) 1 2 WIN32 import pip prin ...

  3. python+selenium+PhantomJS批量投递智联简历(不要用自己的账号进行测试,请使用小号,很烦人的,哈哈哈)

    1.环境python2.7+selenium+PhantomJS(软件安装和库的安装网上都有教程我们跳过,so easy) 2.原理 绕过首页登录需要验证码,直接进入搜索栏,输入搜索的职位+地区搜索出 ...

  4. 可变,不可变与 id 的关系

    变量名不能使用关键字: 查看关键字 import  keyword keyword.kwlist 可变与不可变: 列表添加元素后,id并不会改变.说明列表可变 元祖添加元素后,id会改变,就不是同一对 ...

  5. 在eclipse中安装go编辑器阅读fabric代码

    参考资料 由于fabric采用go语言编写,故需要安装go环境. 安装要求: Java VM version 8 or later. Eclipse 4.6 (Neon) or later. 1. J ...

  6. 如何安装 Microsoft Office 兼容包,以便您可以在早期版本的 Microsoft Office 中打开和保存 Office Open XML 格式

    https://support.microsoft.com/zh-cn/kb/923505 针对 Office 2003 的支持已终止 Microsoft 已于 2014 年 4 月 8 日终止了针对 ...

  7. python 读取bin文件

    python读取bin文件并下发串口   # coding:utf-8import time, serialfrom struct import *import binascii file = ope ...

  8. MySQL PID错误,Mysql server PID file could not be found!

    https://blog.csdn.net/u010098331/article/details/50752667/

  9. jquery移除select下所有的option选项

    $("#search").find("option").remove(); 或者 $("#search").empty();

  10. 14.linux下复制粘贴

    1. 在终端下: 复制命令:Ctrl + Shift + C  组合键. 粘贴命令:Ctrl + Shift + V  组合键. 2. 在控制台下: 复制命令:Ctrl + Insert  组合键 或 ...