廖雪峰python摘录8

1、以高级语言通常都内置了一套try...except...finally...的错误处理机制,Python也不例外。我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。

2、由于没有错误发生,所以except语句块不会被执行,但是finally如果有,则一定会被执行(可以没有finally语句)。

3、Python的错误其实也是class,所有的错误类型都继承自BaseException,所以在使用except时需要注意的是,它不但捕获该类型的错误,还把其子类也“一网打尽”。

4、Python内置的logging模块可以非常容易地记录错误信息。

5、因为错误是class,捕获一个错误就是捕获到该class的一个实例。因此,错误并不是凭空产生的,而是有意创建并抛出的。Python的内置函数会抛出很多类型的错误,我们自己编写的函数也可以抛出错误。

6、Python内置的try...except...finally用来处理错误十分方便。出错时,会分析错误信息并定位错误发生的代码位置才是最关键的。

程序也可以主动抛出错误,让调用者来处理相应的错误。但是,应该在文档中写清楚可能会抛出哪些错误,以及错误产生的原因。

7、程序能一次写完并正常运行的概率很小,基本不超过1%。总会有各种各样的bug需要修正。有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。。用print()最大的坏处是将来还得删掉它,想想程序里到处都是print(),运行结果也会包含很多垃圾信息。所以,我们又有第二种方法(assert)。

8、

这就是logging的好处,它允许你指定记录信息的级别,有debuginfowarningerror等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debuginfo就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。

logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。

时间: 2024-10-11 10:44:48

廖雪峰python摘录8的相关文章

廖雪峰python摘录4

1.直接作用于for循环的对象统称为可迭代对象:Iterable.    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator. 2.生成器都是Iterator对象,但list.dict.str虽然是Iterable,却不是Iterator. 把list.dict.str等Iterable变成Iterator可以使用iter()函数 3.因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有

廖雪峰python摘录3

1.if判断条件还可以简写x.只要x是非零数值.非空字符串.非空list等,就判断为True,否则为False. 2.这是因为input()返回的数据类型是str,str不能直接和整数比较,必须先把str转换成整数.Python提供了int()函数来完成这件事情: s = input('birth: ') birth = int(s) if birth < 2000: print('00前') else: print('00后') 或者 s>'2000' 也可以,需要类型一致才能比较. 要是i

廖雪峰python摘录7

1.我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性. 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性: 2.使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的. 3.为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法

廖雪峰python摘录二轮2

1 >>> def set_age(self, age): # 定义一个函数作为实例方法 2 ... self.age = age 3 ... 4 >>> from types import MethodType 5 >>> s.set_age = MethodType(set_age, s) # 给实例绑定一个方法 6 >>> s.set_age(25) # 调用实例方法 7 >>> s.age # 测试结果 8

廖雪峰python摘录9

1.如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python内置的os模块也可以直接调用操作系统提供的接口函数.注意uname()函数在Windows上不提供,也就是说,os模块的某些函数是跟操作系统相关的.操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中,这一点要注意一下.查看.创建和删除目录可以这么调用.要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数,这样可以把

廖雪峰python 摘录10

1.为了便于程序保存和读取数据,而且,能直接通过条件快速查询到指定的数据,就出现了数据库(Database)这种专门用于集中存储和查询的软件. 2. 在使用SQLite前,我们先要搞清楚几个概念: 表是数据库中存放关系数据的集合,一个数据库里面通常都包含多个表,比如学生的表,班级的表,学校的表,等等.表和表之间通过外键关联. 要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection: 连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获

廖雪峰python摘录5

1.假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator). 2.由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数. 3.wrapper()函数的参数定义是(*args, **kw),因此,wrapp

廖雪峰python摘录6

1 def now(): 2 print('hello') 3 4 import functools 5 6 def log(func): 7 @functools.wraps(func) 8 def wrapper(*args,**kw): 9 print('begin call %s():'% func.__name__) 10 func_tmp=func(*args,**kw) 11 print('end call %s():'% func.__name__) 12 return func

学习笔记_廖雪峰&lt;Python 2.7 教程&gt;

进程和线程的基础知识 CPU执行代码是顺序执行, 单核CPU通过让任务交替执行, "模拟"除了多任务并发执行. 真正的多任务并发, 是在多核CPU上, 每个CPU负责执行一个任务. 但实际任务数量远多于CPU核心数量, 所以最终还是操作系统把多任务轮流调度到不同的核心上执行. 进程/线程和物理内存(寄存器)/CPU的关联: 函数调用, 会在栈中分配一块空间, 存放局部变量和参数, 调用结束, 栈空间被释放. 每个线程都有独立的栈, 寄存器. 同一进程里的所有线程共享文件, 代码和数据.