Python菜鸟学习手册11----异常处理

介绍

在项目开发中,异常处理是不可或缺的。异常处理帮助人们debug,通过更加丰富的信息,让人们更容易找到bug的所在。异常处理还可以提高程序的容错性。

>>> 1/0
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    1/0
ZeroDivisionError: division by zero

上例中输入一除以零触发ZeroDivisionError异常。下面我们来捕捉这个异常

strFormula=input("请输入公式")
while(True):
    if strFormula=="exit":
        print("计算结束")
        break
    try:
        print("%s=%.2f" %(strFormula,eval(strFormula)))
    except ZeroDivisionError:
        print("除数不能为零")
    except:
        print("公式输入有误!")
    strFormula=input("请输入公式")

如果try中有异常发生时,将执行异常的归属,执行except。异常层层比较,看是否是exception1, exception2...,直到找到其归属,执行相应的except中的语句。如果except后面没有任何参数,那么表示所有的exception都交给这段程序处理。

如果无法将异常交给合适的对象,异常将继续向上层抛出,直到被捕捉或者造成主程序报错。比如下面的程序

def test_func():
    try:
        m = 1/0
    except NameError:
        print("Catch NameError in the sub-function")

try:
    test_func()
except ZeroDivisionError:
    print("Catch error in the main program")

子程序的try...except...结构无法处理相应的除以0的错误,所以错误被抛给上层的主程序。

抛出异常

当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行。

try:
     s = None
     if s is None:        #is检查两个对象是否是同一个对象
         print ("s 是空对象")
         raise Error1     #如果引发Error1异常,后面的代码将不能执行
     print (len(s))
except TypeError:
     print ("空对象没有长度")

自定义异常

python允许程序员自定义异常,用于描述python中没有涉及的异常情况,自定义异常必须继承Exception类,自定义异常按照命名规范以"Error"结尾,显示地告诉程序员这是异常。自定义异常使用raise语句引发,而且只能通过人工方式触发。

class MyInputException(Exception):
    def __init__(self, length, least):
        Exception.__init__(self)
        self.length = length
        self.least = least  

try:
    s = input('输入一个字符串:')
# 如果长度小于5,触发自定义的异常
    if len(s) < 5:
        raise MyInputException(len(s), 5)
except EOFError:
    print ('触发了EOF错误,按了Ctrl+d')
except MyInputException as x:                                             #2.6版本之后要使用as
    print ('输入的字符串只有%d,至少需要%d个字符' % (x.length, x.least))
except Exception:
    print ('不知道什么错误!' )
finally:
    print ('有没有异常都会执行这里!')  

小提示:

1.异常处理的格式

try:

...

except exception1:

...

except exception2:

...

except:

...

else:                        #如果try中没有异常,那么except部分将跳过,执行else中的语句。

...

finally:                     # finally是无论是否有异常,最后都要做的一些事情。

...

2.

file_object = open('thefile.txt')
try:
     all_the_text = file_object.read( )
finally:                                    #文件读写将.close()放在finally中是个好习惯
     file_object.close( )

3.python中is和 == 的区别

在python中,is检查两个对象是否是同一个对象,而==检查他们是否相等.

p = [1]
q = [1]
p is q # False 因为他们不是同一个对象
p == q # True 因为他们的值相等

所以如果你要比较两个值是否相同就用==,如果比较是否是同一个对象就用is.

其实python中的is比较的对象很像C语言中的指针,只有地址相同的指针才是同一个指针.

上一讲:Python菜鸟学习手册10----文件的输入与输出

下一讲:

如果有什么疑问欢迎到我的微信公众号提问~

时间: 2024-08-06 15:54:24

Python菜鸟学习手册11----异常处理的相关文章

Python菜鸟学习手册12----循环对象

什么是循环对象 循环对象是这样一个对象,它包含有一个next()方法(__next__()方法,在python 3x中), 这个方法的目的是进行到下一个结果,而在结束一系列结果之后,举出StopIteration错误. 当一个循环结构(比如for)调用循环对象时,它就会每次循环的时候调用next()方法,直到StopIteration出现,for循环接收到,就知道循环已经结束,停止调用next(). 假设我们有一个test.txt的文件: 1234 abcd efg 我们运行一下python命令

Python菜鸟学习手册10----文件的输入与输出

文本文件的读写主要通过open()所构建的文件对象来实现. 基本格式 f = open(文件名,模式) 最常用的模式有: "r"       # 只读 "w"     # 写入                                                               ---->如果文件中已经有内容,会把内容抹掉,如果不存在该文件,会新建文件 "a"      #追加模式                  

Python菜鸟学习手册15----多线程

线程与进程 程序相当于工厂,进程相当于车间,线程相当于工人.在一个工厂中往往有多个车间,在一个车间上有多个工人并行工作. 同车间上的工人共享房间,但是有些房间一次只能容纳一个人,比如厕所.在厕所里有人的时候,其他人不能进入.一个防止他人进入的简单方法,就是门口加一把锁.先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去.这就叫"互斥锁"(Mutual exclusion,缩写 Mutex). 还有些房间,可以同时容纳n个人,如果人数大于n,多出来的人只能在外面等着.这时的解

Python菜鸟学习手册05----控制流

在到目前为止我们所见到的程序中,总是有一系列的语句,Python忠实地按照它们的顺序执行它们.如果你想要改变语句流的执行顺序,该怎么办呢?例如,你想要让程序做一些决定,根据不同的情况做不同的事情,例如根据时间打印"早上好"或者"晚上好". 类似java语言,Python中有三种控制结构--三种控制流语句--if.for和while. 1.if if主要用于条件判断. 1.1 if结构 i = 1 x = 1 if i > 0: #注意后面的冒号必不可少! x

Python菜鸟学习手册06----函数

1.简介 函数是重用的程序段.它们允许你给一块语句一个名称,然后你可以在你的程序的任何地方使用这个名称任意多次地运行这个语句块.这被称为调用函数.我们已经使用了许多内建的函数,比如input()和range(). 2.函数的定义和调用 函数通过def关键字定义.def关键字后跟一个函数的标识符名称,然后跟一对圆括号.圆括号之中可以包括一些变量名,该行以冒号结尾.接下来是一块语句,它们是函数体. def sayHi():<span style="white-space:pre"&g

head first python菜鸟学习笔记(第三章)

1.os.chdir()切换到指定目录下,os.getcwd(),得到当前目录. >>> import os>>> os.chdir('D:\\CodeDocuments\\python code\\python head first code\\03chapter3')>>> os.getcwd()'D:\\CodeDocuments\\python code\\python head first code\\03chapter3' 2.print(

head first python菜鸟学习笔记(第四章)

1,p124,错误:NameError: name 'print_lol' is not defined 要想文件内如图显示,需要把调用BIF print()改为调用第二章的nester模块中的print_lol()函数,因此需要导入nester模块. 首先需要修改第二章nester模块中的print_lol()函数并更新该模块,更新方法如图: 然后在sketch.py中调用print_lol()函数. 1 ''' 2 修改时间:0919 3 修改内容:把调用BIF print()改为调用第二章

Python Twisted 学习系列11(转载stulife最棒的Twisted入门教程)

第十一部分:改进诗歌下载服务器 作者:[email protected]http://krondo.com/?p=2048译者:杨晓伟(采用意译) 第十一部分:改进诗歌下载服务器 你可以从这里从头阅读这个系列. 诗歌下载服务器 到目前为止,我们已经学习了大量关于诗歌下载客户端的Twisted的知识,接下来,我们使用Twisted重新实现我们的服务器端.利益于Twisted的抽象机制,接下来你会发现我们前面已经几乎全部学习到这部分知识了.其实现源码在twisted-server-1/fastpoe

PHP菜鸟学习历程-11

[继承] 在php,一个类去继承另一个类,本类实例化出来的对象,既可以调用本身类的成员,也可以调用父类的成员. 在javascript继承主要通过原型实现,构造函数继承一个对象,构造函数的实例会拥有被继承对象的相关成员. 原型继承prototype 具体实现: 1单成员继承 “构造函数”通过原型的方式继承单一的成员. 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset=&q