程序员总是和各种错误打交道,学习如何识别并正确的处理程序错误是很有必要的。

7.1错误和异常

1、错误

从软件方面来看,错误分为语法错误和逻辑错误两种。这两种错误都将导致程序无法正常进行下去,当Python检测到一个错误时就出现了异常。

2、异常

当编译器检测到错误并且意识到错误条件。解释器会引发一个异常(程序员也可以自己引发一个异常,后面会说到)。

以下是7种Python中常见的错误。

1、NameError,尝试访问一个未申明的例子。

2、ZeroDivisionError,零除错误。

3、SynataxError,解释器语法错误。

4、IndexError,请求的索引超出范围。

5、KeyError,请求一个不存在的字典Key。

6、IOError,输入输出错误,例如尝试打开一个不存在的文件。

7、AttributeError,尝试访问 为未知的对象属性。

7.2异常检测和异常处理

7.2.1 try-excep语句

try:
FileTest=open('blash','r')
except IOError,e:
print 'could not open file'

此时当发生输入输出错误的时候程序不会停止,而是捕获异常显示预先定义的字符串。需要注意的是只有当捕获IOError时会执行print语句,当发生其他类型的异常时程序仍会停止,此时我们我们可能需要带多个except的try语句。

7.2.2带有多个except的try语句

可以将多个except语句连起来,如下所示

except Exception1[,reason1]:

suit_for_exception1

except Exception2[,reason2]:

sut_for_exception2

程序执行时未发生错误忽略所有except语句,如果发生异常则在多个except语句中查找匹配的异常。这样开发时既能捕获多种类型异常,帮助我们处理错误。

7.2.3捕获所有异常

根据上面带多个except的语句可以捕获多种异常,但事实上程序总会发生我们意想不到的异常,所有如果可以捕获所有异常而不仅限于我们指定的异常那么对开发将有比较大的帮助。

但是捕获所有所有异常有个缺陷,就是它不会告诉你到底捕获了什么异常,也无法让你应对不同类型的异常。

它的用法是:

try:

except (KeyboardInterrupt,SystemExit):
#user wants quit
raise
except Exception:
#handle real Errors

需要解释的是KeyboardInterrupt,SystemExit并不是真正意义上的异常,前者是用户按下Ctrl+C后者表示程序需要退出,所以想要程序正常退出时不被捕获异常需要上面的代码。

7.2.4获取异常原因

捕获异常后只有得到异常发生的原因才能帮助我们改进。

except语句的使用:

except exception[,reason]

括号中的reason即是异常的原因,异常参数。异常参数可以忽略,如果需要访问异常的原因那么reason则是必须的。reason是包含导致异常的代码的诊断信息的类实例,虽然从异常的名字就可以获知发生了何种异常,但是reason将提供更多的异常信息。

用法如下:

def safe_float(object):
try:
retval=float(object)
except (ValueError,TypeError),reason:
retval=str(reason)
return retval print safe_float('xyz')

程序将显示could not convert string to float: xyz,是的编译器返回了具体的错误原因。

7.2.5 else 语句

我们已经见过if-else,while-else语句,try-except-else当然也是可以使用的,其意义是在try范围内没有异常检查到则执行else语句。

7.2.6 finally语句

try-except-finally中的finally子句表示无论是否捕获到异常都将执行的一段代码。当然"try-except-else-finally"也是完全可以搭配的。很简单不在多说,需要注意的是except语句可以有不止一个,但是至少要有一个。else和finally都是可选的。

7.3异常触发

7.3.1 raise语句

有时我们可能需要引发一个异常,此时需要raise语句。使用如下:

raise [SomeException[,args[,traceback]]]

第一个参数SomeException是必要的,你需要提供要引发的异常名。第二个参数args是将参数传递给异常;第三个参数是用于异常-正常化(exception-narmally)的跟踪记录(traceback)记录。当程序运行到raise语句时会跳出并引发你需要的异常。

7.4断言

7.4.1 断言可以理解为(raise if not...)当布尔值为假时抛出异常。断言关键字为assert,用法如下:

assert expression[,arguments]

表达式后面是我们提供的异常参数。

Python学习笔记七-错误和异常的更多相关文章

  1. python学习笔记014——错误和异常

    Python有两种错误很容易辨认:语法错误和异常. 1 什么是语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 if i>4 print("if语句输出 ...

  2. Python学习笔记13—错误和异常

    常见的异常:

  3. Python学习 Part6:错误和异常

    Python学习 Part6:错误和异常 两种不同类型的错误:语法错误和异常 1. 语法错误 语法错误,也被称作解析错误: >>> while True print('Hello w ...

  4. Python 3 学习笔记之——错误和异常

    1. 语法错误 Python 的语法错误被称为解析错,语法分析器会指出出错的代码行,并且在最先找到的错误的位置标记一个小小的箭头. >>> while True File " ...

  5. python学习笔记(七)、异常

    在实际开发中,往往不会出现一个系统编写下来,没有出现任何一个bug.为处理这种会出现错误的地方,如除数为零的除法,python提供了非常强大的机制————异常处理机制. 1 异常 python使用异常 ...

  6. Python入门笔记(17):错误、异常

    一.什么是错误,什么是异常,它们两者区别 这里解释如下:个人觉得很通俗易懂 错误是指在执行代码过程中发生的事件,它中断或干扰代码的正常流程并创建异常对象.当错误中断流程时,该程序将尝试寻找异常处理程序 ...

  7. python学习笔记七 初识socket(进阶篇)

    socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

  8. Python学习笔记012_网络_异常

    1,Python如何访问互联网? url + lib =  urllib >>> # 使用urllib包下的request模块 >>> >>> i ...

  9. Python学习笔记七

    面向对象编程 面向对象的特性如下: 类:具有相同属性和方法的一类事物,成为类. 对象:类的实例化后的结果,一个类可以实例化多个对象,每个对象也可以不同的属性. 封装:在类中对数据的赋值,类里面包含着类 ...

随机推荐

  1. -_-#【Mac】命令

    切换cd $HOMEcd ~ 查看ls 查看系统显示:defaults write com.apple.finder AppleShowAllFiles -bool true隐藏:defaults w ...

  2. fmt命令

    简单的格式化文本 fmt [option] [file-list] fmt通过将所有非空白行的长度设置为几乎相同,来进行简单的文本格式化 参数 fmt从file-list中读取文件,并将其内容的格式化 ...

  3. 深入JS系列学习4

    深入JS系列学习4 Javascript 装载和执行 明白了JS的装载和执行,没有给出很好的解决方案,在IE下可用defer属性: 浏览器对于Javascript的运行有两大特性:1)载入后马上执行, ...

  4. AES - Rijndael 算法(二)

    三:Rijndael算法实现(C++版本) /*-------------------- Rijndael round subkeys ---------------------*/u8 roundK ...

  5. NSOutputStream\NSInputStream

    NSOutputStream-保存网络资源到本地 _filePath = [[NetworkManager sharedInstance] pathForTemporaryFileWithPrefix ...

  6. java下载csv文件,中文标题

    @RequestMapping(value = "/export.do") public void exportpushuserByareacode(HttpServletRequ ...

  7. Activity内部Handler引起内存泄露的原因分析

    有时在Activity中使用Handler时会提示一个内存泄漏的警告,代码通常如下: public class MainActivity extends Activity { private Text ...

  8. AMD 规范以及如何将AMD转变为CommonJS

    原文:http://villadora.me/2014/05/23/amd-define-and-how-to-translate-amd-to-commonjs/ CommonJS和AMD的争论已经 ...

  9. Java基础知识强化20:面向对象和面向过程的思想对比

    面向对象与面向过程的区别  1. 与面向对象编程思想相比较的,往往是面向过程的编程思想,其实在我来理解,两者并不冲突,原因是面向对象的编程也必须使用面向过程的思维来实现具体的功能,所以我认为,两者的区 ...

  10. MySQL(12):windows下解决mysql忘记密码

    mysql有时候忘记密码了怎么办?我给出案例和说明!一下就解决了!    Windows下的实际操作如下 : 1. 关闭正在运行的MySQL.  2. 打开DOS窗口,转到mysql\bin目录. 3 ...