python学习笔记系列----(六)错误和异常

python至少有2类不同的错误:语法错误(Syntax Errors)和异常(Exceptions)。

8.1 语法错误

这个单词应该还是很有必要认识的,呵呵,语法错误,也叫解析错误,是我们最不愿意发生的错误,直接拿官网的例子:

>>> while True print ‘Hello world‘
  File "<stdin>", line 1, in ?
    while True print ‘Hello world‘
                   ^
SyntaxError: invalid syntax

语法错误提示时会先打印出现语法的语句然后在这语句中打上‘ ^ ’ 表示离语法错误最近的地方。例子中就是在print前少了引号(这是一个死循环~~):

>>> while True: print ‘Hello world‘
...
Hello world

8.2 异常
      一个语句或者一个表达式即使编译时是没有语法错误的,但是也有可能在执行时出现问题,这种问题也叫异常(非致命性),异常通常都是有在程序中进行处理的。异常是有不同类型的,常见的异常类型有ZeroDivisionError, NameError and TypeError,这类异常称为标准异常,是在build-in里面定义的,可以查看Built-in Exceptions。还有一类异常是用户自定义的。

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero>>> ‘2‘ + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: cannot concatenate ‘str‘ and ‘int‘ objects

8.3 处理异常

直接给一个比较全的异常处理的例子:打开一个txt文档,读入第一行的数据,转换成int数据类型,如果都成功,就打印txt总共有多少行,最后关闭文档。

    try:
        f = open (‘test.txt‘,‘r+‘)
        s = f.readline()
        i = int(s.strip())
    except IOError as e:
        print ‘I/O error({0}):{1}‘.format(e.errno,e.strerror)
    except ValueError:
        print "could not convert data to integer"
    except:
        print "unexpected error:",sys.exc_info()[0]
    else:
        print ‘there has {0} lines in the file‘.format(len(f.readlines()))
    finally:
        print ‘end of the function‘
        f.close()

try语句处理异常,是这样做的:

A. 首选,try子语句(try和except关键字之间的语句)会被执行。

B. 如果没有异常发生,except 子句被略过。

C. 如果有异常发生,try后面的其他语句就被跳过了,如果异常类型在except关键字后匹配,这个except子句被执行。

D. 如果没有异常发生,else子句就会被执行。else的作用是它避免了捕获未保护的代码所发起的异常。

E. finally语会在try子句执行完毕之前执行,不管是否发生或者不发生异常。当一个异常发生在try子句中却未被处理时(或者发生在except或者else子句中时),finally子句执行完后会再次抛出异常。

这些基本的语法,应该也基本都是比较清楚的,文档里列出了一些需要注意的地方:

第一:一次性处理多个异常时,多个异常需要用括号括起来。

except (RuntimeError, TypeError): 这样是正确的;except RuntimeError, TypeError: 写法是错误的,因为except ValueError, e 在语法上等价于except ValueError as e。

第二:最后一个except子句可以不带异常类型名,这样就可以捕获任何未被定义的异常。

第三:当一个异常发生时,可能它还有一些异常的参数。except语句的异常名字后面可以跟一个参数,这个参数会跟异常实例绑定,存储在instance.args中,如果异常中__str__() 定义过了,就可以直接打印出参数了。

>>> try:
...     raise Exception(‘spam‘, ‘eggs‘)
... except Exception as inst:
...     print type(inst)     # the exception instance
...     print inst.args      # arguments stored in .args
...     print inst           # __str__ allows args to be printed directly
...     x, y = inst.args
...     print ‘x =‘, x
...     print ‘y =‘, y
...
<type ‘exceptions.Exception‘>
(‘spam‘, ‘eggs‘)
(‘spam‘, ‘eggs‘)
x = spam
y = eggs

8.4 用户自定义异常

用户自定义的异常需要继承Exception类,官网例子如下:

>>> class MyError(Exception):
...     def __init__(self, value):
...         self.value = value
...     def __str__(self):
...         return repr(self.value)
...
>>> try:
...     raise MyError(2*2)
... except MyError as e:
...     print ‘My exception occurred, value:‘, e.value
...
My exception occurred, value: 4
>>> raise MyError(‘oops!‘)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
__main__.MyError: ‘oops!‘

在这个例子中,init方法被重写了,用于创建一个新的成员变量value。

8.5 已定义好的清理行为

当不再需要这个对象的时候,有一些对象已经定义好了标准的清理行为,不管使用这个对象操作成功或者失败;常见的例子还是打开文档:

for line in open("myfile.txt"):
    print line,

这段代码的问题是在这段代码执行后,文档处于open的状态时间是不确定的,在一个小的脚本里,这不会是一个很严重的问题,但是如果是一个大应用程序中的一部分,这个问题就会被放大。使用with语句,就允许一些像files的类在使用完后能被清理完(释放某些资源吧,我是这样理解的):

with open("myfile.txt") as f:
    for line in f:
        print line,

换成这行代码后,f已经处于close状态了。即使在读文件里的每一行遇到错误,也会关闭掉。

 

时间: 2024-10-03 09:54:17

python学习笔记系列----(六)错误和异常的相关文章

python学习笔记系列----(一)python简介

一个月前,就按下决心要系统的学习下python了,虽然之前有学习过java,学习过c++,也能较为熟练的使用java做自动化测试看懂c++里的业务逻辑,但是实际上有那么多的东西自己还是不清楚,今天下定决心,开始了python的系统的学习之路,之前我是有看过廖学峰的教程的,看完收获确实也是少,但总感觉就是少了什么,后面想了下,我想应该是自己的学习方法~~~介于之前学习RF的经验,我认为看官方文档对于一个想系统学习python的人来说,真的是一个不能再好的学习方法,接下来我会开始坚持把python2

python学习笔记十六 django深入学习一

django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), #精确匹配 url(r'^articles/([0-9]{4})/$', views.year_archive), #动态路由 url(r'^articles/([0-9]{4})/([0-9]{2

Python学习笔记五:错误、调试和测试

1 # !/usr/bin/env python 2 # coding:utf-8 # 编码 3 4 'a test module' 5 6 __author__ = 'Sunflower' 7 8 9 # 异常错误类型 10 # AssertionError 断句错误 11 try: 12 my_list =['zhangsan'] 13 assert len(my_list) > 0 14 my_list.pop() 15 assert len(my_list) > 0 16 except

Python学习笔记系列之000:Python简介

一.Python是什么? Python时候全球4大最流行的编程语言之一,因为其语法简洁.功能强大,目前已广泛应用于人工智能.云计算开发.大数据开发.数据分析.科学运算.网站开发.爬虫.自动化运维.自动化测试.游戏开发金融分析等领域. 二.Python的优点 1. Python的定位是"优雅"."明确"."简单". 2. 开发效率非常高. Python有非常强大的第三方库,基本上你想通过计算机实现任何功能,Python官方库里都有相应的模块进行支持

Python学习笔记(六)多进程实现并发服务器

这个相对于多进程更加简单,每accept一个新的连接就创建一个新的线程.代码如下: # coding: utf-8 import socket import sys import errno import threading from time import ctime class ClientThread(threading.Thread): def __init__(self, client_socket, client_address): threading.Thread.__init__

python学习笔记系列----(四)模块

这一章主要是叙述了python模块的概念以及包的概念,还有它们的使用:收获也是大大的. 提起python文件,经常会听到3个名词,python脚本,python模块,python包.脚本的概念是从python交互式命令行引用过来的,把在命令行内运行的代码段复制到一个文件里再运行,这个文件就可以称为一个脚本:脚本之间可能存在相同的函数等,为了一个脚本能使用另一个脚本里的函数等,这里的另一个脚本就可以称为一个模块,也就是说一个模块里的定义是可以被导入到别的模块或者主模块中使用的:python包是py

python学习笔记系列----(二)控制流

实际开始看这一章节的时候,觉得都不想看了,因为每种语言都会有控制流,感觉好像我不看就会了似的.快速预览的时候,发现了原来还包含了对函数定义的一些描述,重点讲了3种函数形参的定义方法,章节的最后讲述了PEP8的一些重要的规范,在学习的过程中还是学到了些知识. 2.1  if 语句 if语句就不多说了,经常跟else if .. 和 else ..一起使用,如下所示: >>> x = int(raw_input("Please enter an integer: "))

Python学习笔记十六_模块结构调整

一.什么是模块结构调整 当一个脚本中有大量的配置.方法及接口时,脚本往往显得十分臃肿.为了代码更易读,可以将一个繁杂的脚本根据不同的功能放在不同的文件夹中分类管理,即模块结构调整. 二.模块结构调整实例 下面根据一个具体的例子来看一下如何拆分调整代码 1.根据正常人的思维写代码完成功能 代码需求: (1) 注册接口: (a) 写一个注册接口,密码存成密文 (b) 数据存到redis,redis的key用string类型 (c) Amy  7869d295e566295b51eec5d6bed67

Python学习笔记(六)之 面向对象

一.面向过程 VS 面向对象 编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 ,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种不同的方式,对这些不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式.不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路,大多数语言只支持一种编程范式,当然也有些语言可以同时支持多种编程范式.两种最重要的编程范式分别是面向过程编程和面向