python怎么捕获模块异常_Python 入门 —— Python 异常的捕获,模块的调用

Python 异常的捕获,模块的调用

1 异常

Python 使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让 Python 不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个 traceback (回溯),其中包含有关异常的报告。

异常是使用 try-except 代码块处理的。 try-except 代码块让 Python 执行指定的操作,同时告诉 Python 发生异常时怎么办。使用了 try-except 代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的 traceback(回溯) 。

简单的说,在程序开发中,如果对某些代码的执行不确定(程序语法完全正确)

1.1 通过 try 来进行简单的异常捕获

语法如下:

try:

尝试执行的代码

expect:

出现错误的处理

示例:编写一简单的代码段,无语法错误,并使其产生异常

num = int(raw_input('Please input a num:'))

# 一个简单的交互式变量定义,要求输入的必须为整型变量

'Please input a num type int'

执行如下:返回一个字符串类型,将会报错,因为报错,所以不会继续执行下面的print语句

caeb93bf23cb3823643c4f52741cc8e1.png

通过错误类型,可对其进行抓取,让程序继续执行

try:

num = int(raw_input('Please input a num:'))

except:

print 'Please input a num type int'

# 无论执行是否正确,都会显示

print '#' * 50

执行如下:

10f30796081f2fae66777a7ec26aae16.png

控制台显示如下:

25b724792b2974e8e724c5bbb0008479.png

1.2 捕获指定错误:

当python解释器抛出异常时,最后一行错误信息的第一个单词,就是错误类型

可通过指定异常类型,对其进行捕捉,从而决定下一步程序的执行

语法

try:

pass

except 错误类型:

pass

通过指定错误类型,来进行捕获异常

try:

num = float(raw_input('Please in put a num: '))

result = 8 / num

print result

except ZeroDivisionError:

print "0 false,0 can't be the divisor"

except ValueError:

print "Please input a num type int"

执行如下:

a286803ed8ea11128da429b02387035e.png

输入0,控制台显示:

915866896262c895670e13143e1b2f22.png

输入非整型字符,控制台显示:

b01e3150222f39af30584f3e771ee02f.png

1.3 捕获未知错误

我们无法预见所有的程序将会出现的非语法性错误,因此需要借由捕获未知的错误

语法:

except Exception as

示例

try:

num = float(raw_input('Please in put a num: '))

result = 8 / num

print result

except ValueError:

print "Please input a num type float."

except Exception as result:

print "Unknown error: %s" % result

执行如下:

ddf4b6420e967eadc14c578b7cd12993.png

控制台显示:

9410b53a025abd11083789a7a8f5e88b.png

1.4 捕获异常意外的输出,正确输出与最终输出

除了可能出现的异常清况外,还有正确的输入与输出,可以对此进行注释,或动作的添加

语法: 捕获异常的最终形式

try:

# 尝试执行的代码

pass

except: 错误类型1

pass

excpet: 错误类型2

pass

except Exeption

else:

# 没有异常才会执行的代码

pass

finall:

# 无论是否有异常都会执行的代码

pass

示例:

try:

# 尝试执行的错误

num = float(raw_input('Please in put a num: '))

result = 8 / num

print result

# 捕获执行错误类型

except ValueError:

print "Please input a num type float."

# 捕获未知异常

except Exception as result:

print "Unknown error: %s" % result

# 没有出现异常时才会执行的代码

else:

print "Execute successfully!"

# 无论是否异常,都会执行的代码

finally:

print "End"

执行如下:

51cb9492fbe4151d19ba4830ea2ae19a.png

控制台显示如下:

e19d65b86412f5162146e1b25d961055.png

1.5 异常的传递性

异常的传递

当函数/方法执行出现异常,会将异常传递给函数/方法调用的一方如果传递到主程序, 依旧没有异常处理,程序才会终止,可以在主程序中增加

异常捕获,而在主函数中调用其他函数,只要出现异常,都会传递到主函数的异常捕获中,这就不需要在代码中,增加大量的异常捕获,能够保证代码的整洁

示例:一个可正确执行的代码段,因为错误输出,出现异常

def demo1():

return int(raw_input('Please input a num: '))

def demo2():

return demo1()

print demo2()

执行如下:

ed266369a4a032a6e527ff50543b17be.png

控制台显示如下:

a43057d082c07c8aa3646f70a0b3ef4f.png

对其异常进行捕获:

def demo1():

return int(raw_input('Please input a num: '))

def demo2():

return demo1()

try:

print demo2()

except Exception as result:

print 'Unknown error:%s' % result

执行如下:

9218ced8f8eb2789d4fd4f212f02d117.png

控制台显示如下:

1a43887ca8635181898fe497673907d0.png

1.6 抛出异常并捕获

为了满足一些限定需求,有时需要进行主动的对异常的抛出,并对其进行捕获操作

示例:

判断用户输入的密码

1.<8 错误

2.>=8 返回输入的密码

进行异常的抛出

def password():

passwd = raw_input('Please input passwd:')

if len(passwd) >= 8:

return passwd

# 创建异常对象(可添加错误信息)

error = Exception('The passwd is too short')

raise error

执行如下:

64905bb33464aa1d848f0f48e60b94d8.png

控制台显示如下:

de88aa92e6cb19e678a0d8cc2690464c.png

对抛出的错误进行捕获:

def password():

passwd = raw_input('Please input passwd:')

if len(passwd) >= 8:

return passwd

# 创建异常对象(可添加错误信息)

error = Exception('The passwd is too short')

raise error

# 注意:只抛出异常而不捕获,代码会显示错误

try:

print password()

except Exception as result:

print 'error:%s ' % result

执行如下:

46ff859c160ba270417e472d2b57dd75.png

控制台显示如下:

71c36280d5dbdd81e12a134979f2cbb9.png

1.7 断言

python assert 断言句语格式及用法很简单。在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助。

断言:可理解为提前预言,让人更好的知道错误原因

示例:

def test(num,div):

assert (div != 0) # 规定。div不能等于 0

return num / div

print test(10,0)

执行如下:

d61913169d981bf80fba7023fdf103e8.png

控制台显示如下:显示错误

44621e27b12528271fd4120d731b3c47.png

可通过断言进行预见

4af203d7a842b5b500123c8fd71df0fb.png

执行如下:

47a29d4442bcfb0621e6b1e76e3b391a.png

2 模块

python函数的优点之一是:使用它们可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解得多。你还可以更进一步,将函数存储在被称为模块 的独立文件中,再将模块导入 到主程序中。 import 语句允许在当前运行的程序文件中使用模块中的代码。

通过将函数存储在独立的文件中,可隐藏程序代码的细节,将重点放在程序的高层逻辑上。这还能让你在众多不同的程序中重用函数。将函数存储在独立文件中后,可与其他程序员共享这些文件而不是整个程序。知道如何导入函数还能让你使用其他程序员编写的函数库。

类同样也可以进行跨模块调用

定义两个模块再对其进行跨模块调用

模块一:

test1 = "I'm module 1"

def say_hello():

print test1

class Car(object):

def __init__(self, name):

self.name =name

def __str__(self):

return self.name

执行如下:

d2ac270718fc5e2b9b365ce15af2dd87.png

模块二:

test2 = "I'm module 2"

def say_hello():

print test2

class Plane(object):

def __init__(self, name):

self.name = name

def __str__(self):

return self.name

执行如下:

f243c77da3fa38024333c6d5a8693a1a.png

进行调用:

导入方法1:直接导入

import test1

import test2

test1.say_hello() # 调用函数

BMW = test1.Car('BMW') # 调用类,进行对象的建立

print BMW

test2.say_hello()

B747 = test2.Plane('747')

print B747

执行如下:

f2f47fc71c7b5037469863e9d6e5c8c5.png

控制台显示如下:

51a90ab65fc339d893ffb59b7c590014.png

导入方法2:给模块起别名

# 给模块起别名:

import test1 as CarModule

import test2 as PlaneModele

CarModule.say_hello() # 调用函数

BMW = CarModule.Car('BMW') # 调用类,进行对象的建立

print BMW

PlaneModele.say_hello()

B747 = PlaneModele.Plane('747')

print B747

执行如下:

f55f60268f3dcb6a84e61b064879cb21.png

控制台显示如下:

e419f2a89648b3436747c64c365291de.png

导入方法3:

from test1 import Car

from test2 import Plane

from test1 import say_hello

from test2 import say_hello as test2_say_hello

say_hello() # 调用函数,test1 的函数

test2_say_hello() # # 调用函数,test2 的函数

BMW = Car('BMW') # 调用类,进行对象的建立

print BMW

B747 = Plane('747')

print B747

此种方法导入是为了更加具体的进行导入,调用时更加方便,重新定义函数名是为了区别不同模块的同名函数

执行如下:

6916793a1f64dbeefbcbc1aca9115c1e.png

控制台显示如下:

0b8bc11e625a9d78c4cd7ae03cd8cd8d.png

模块调用时出现的问题

1.建立模块不能与系统中已有的模块重名

python的解释器再导入模块的时候,会

1.搜索当前目录指定的模块文件,如果有就直接导入

2.如果没有,再搜索系统目录

因此建立模块不能与系统中已有的模块重名

示例:对随机数进行调用

定义一个与random相同的模块,在其中进行调用

import random

num = random(1,10)

print num

执行如下:

794d755ab7a4dbe9a90dbe168165e8c4.png

控制台显示如下:会报错

7e2155cf0598244f9bb3104343037053.png

若是删除此模块

随意定义一与random不同的模块

import random

rand = random.randint(1,10)

print rand

执行如下:

568c597d84a3ef61346d26638e7f0b88.png

控制台显示如下:,成功产生随机数

75db9eb9add9ed30fb0d95fbbe03c569.png

模块调用时,未进行函数调用,自动显示结果

在进行模块调用时,我们仅仅调用了模块,没有想对其内容进行操作,但是,模块中的各项被调用了。为了避免这种情况的发生,我门可以用控制语句对被调用模块的内容进行限制

name属性

name属性可以做到,测试模块的代码只在测试情况下被运行,二再导入时不会被运行

name是python的一个内置属性,记录着一个字符串

如果是被其他文件导入时,name就是模块名

如果是当前执行的程序,name就是main

模块 _ name _

def demo():

print 'Hello'

print 'Surprise!!'

demo()

print __name__

执行如下:

1112a7be0d710a02fb584141b2262f80.png

控制台结果如下:

6413c8255f08223e47d6328a64bd6b16.png

跨模块调用

调用模块:

import __name__

执行如下:

f232eccba738041a15f37ede064b1f79.png

控制台显示如下:

44984dfe3ac366f1abeddacf1efa19b3.png

我们仅仅调用了模块,没有想对其内容进行操作,但是,模块中的各项被调用了

为了避免这种情况的发生,我门可以用控制语句对被调用模块的内容进行限制

__name__2 模块:

def demo():

print 'Hello'

if __name__ == '__main__':

print 'Surprise!!'

demo()

执行如下:

d0ff2d2e6ddbae19529fa6301e0a45a7.png

控制台显示如下:

fd4da4781a565d24de77abf08ec1bc88.png

对其进行调用

调用模块

import __name__2

执行如下:

863820e0d6e735a18d188b59d01529dc.png

控制台显示如下:

1e71e99d8e2ce6dbd3b8dcc7a12b0677.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值