Python异常和调试.md
异常捕获
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的更多相关文章
- python 异常
引用一段来自菜鸟教程的文章:http://www.runoob.com/python/python-exceptions.html Python 异常处理 python提供了两个非常重要的功能来处理p ...
- 小学生绞尽脑汁也学不会的python(异常,约束,MD5加密,日志处理)
小学生绞尽脑汁也学不会的python(异常,约束,MD5加密,日志处理) 异常处理(处理) 1.产生异常.raise 异常类(),抛出异常2. 处理异常: try: xxxxx # 尝试执行的代码. ...
- 【AMAD】stackprint -- 为Python加入利于调试的traceback信息
简介 动机 作用 用法 热度分析 源码分析 个人评分 简介 为Python加入利于调试的traceback信息.  动机 Python抛出异常时,会显示一些traceback信息.但是,一些时候这些 ...
- [转] python程序的调试方法
qi09 原文 python程序的调试方法 本文讨论在没有方便的IDE工具可用的情况下,使用pdb调试python程序 源码例子 例如,有模拟税收计算的程序: #!/usr/bin/python de ...
- [置顶] 如何在Python IDLE中调试Python代码?
好久没有用Python了,居然忘记了怎么在Python IDLE中调试Python代码.百度了一下,然后还是写下来吧,以免以后又忘记了. 1. Set break point in the sourc ...
- #21 Python异常
前言 运行程序时经常遇到各种错误,例如:ImportError(导入模块错误).IndexError(索引错误).NameError(变量错误).SyntaxError(语法错误).Indentati ...
- Python异常和异常处理
Python异常和异常处理2017年12月20日 22:17:08 Megustas_JJC 阅读数:114 标签: python 异常处理 更多 个人分类: Python 版权声明:本文为博主原创文 ...
- python——异常except语句用法与引发异常
except: #捕获所有异常 except: <异常名>: #捕获指定异常 except:<异常名1,异常名2):捕获异常1或者异常2 except:<异常名>,< ...
- 笔记-python异常信息输出
笔记-python异常信息输出 1. 异常信息输出 python异常捕获使用try-except-else-finally语句: 在except 语句中可以使用except as e,然后通 ...
随机推荐
- C#连接数据库最基本操作之sql语句 DML
C#连接数据库最基本操作之sql语句 DML //1 连接字符串 string connectionString = "server=127.0.0.1;integrated securit ...
- USACO 2008 Running(贝茜的晨练)
[题解] 动态规划,dp[i][j]表示第i分钟疲劳度为j的最长距离. [代码] #include <iostream> #include <cstdlib> #include ...
- 第11章 拾遗3:虚拟局域网(VLAN)
1. 虚拟局域网(VLAN) (1)VLAN是建立在物理网络基础上的一种逻辑子网,它将把一个LAN划分成多个逻辑的局域网(VLAN),每个VLAN是一个广播域,VLAN内的主机间通信就和在一个LAN内 ...
- 3-scala高级
1.模式匹配 //①简单表示: sign = ch match { case '+' => 1 case '-' => -1 case '_' => 0 } //②守卫:(case中 ...
- mac“打不开身份不明的开发者”
在mac安装软件发现这样的提示 解决方法: 打开系统偏好设置-->安全与隐私-->通用-->选择任何来源 不能选择的话点击按钮锁即可编辑 没有“任何来源”选项(比如我的mac) 打开 ...
- 安全测试8_Web安全实战2(暴力破解)
1.暴力破解的概念 顾名思义,暴力破解的原理就是使用攻击者自己的用户名和密码字典,一个一个去枚举,尝试是否能够登录.因为理论上来说,只要字典足够庞大,枚举总是能够成功的! 2.暴力破解的实战 在有了之 ...
- 微信小程序开发踩坑日记
2017.12.29 踩坑记录 引用图片名称不要使用中文,尽量使用中文命名,IDE中图片显示无异样,手机上图片可能出现不显示的情况. 2018.1.5 踩坑记录 微信小程序设置元素满屏,横向直接w ...
- 用Java实现adb命令的各种方式
package com.function; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.D ...
- linux环境下Mysql的卸载和重新安装和启动
MySql安装 1 安装包准备 1.查看mysql是否安装,如果安装了,卸载mysql (1)查看 [root@hadoop102 桌面]# rpm -qa|grep mysqlmysql-libs- ...
- redis下操作列表list
list 列表的元素类型为string 按照插入顺序排序 在列表的头部或者尾部添加元素 命令 设置 在头部插入数据 LPUSH key value [value ...] 在尾部插入数据 RPUSH ...