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语句
通过错误类型,可对其进行抓取,让程序继续执行
try:
num = int(raw_input('Please input a num:'))
except:
print 'Please input a num type int'
# 无论执行是否正确,都会显示
print '#' * 50
执行如下:
控制台显示如下:
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"
执行如下:
输入0,控制台显示:
输入非整型字符,控制台显示:
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
执行如下:
控制台显示:
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"
执行如下:
控制台显示如下:
1.5 异常的传递性
- 异常的传递
当函数/方法执行出现异常,会将异常传递给函数/方法调用的一方如果传递到主程序, 依旧没有异常处理,程序才会终止,可以在主程序中增加
异常捕获,而在主函数中调用其他函数,只要出现异常,都会传递到主函数的异常捕获中,这就不需要在代码中,增加大量的异常捕获,能够保证代码的整洁
示例:一个可正确执行的代码段,因为错误输出,出现异常
def demo1():
return int(raw_input('Please input a num: '))
def demo2():
return demo1()
print demo2()
执行如下:
控制台显示如下:
对其异常进行捕获:
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
执行如下:
控制台显示如下:
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
执行如下:
控制台显示如下:
对抛出的错误进行捕获:
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
执行如下:
控制台显示如下:
1.7 断言
- python assert 断言句语格式及用法很简单。在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助。
- 断言:可理解为提前预言,让人更好的知道错误原因
示例:
def test(num,div):
assert (div != 0) # 规定。div不能等于 0
return num / div
print test(10,0)
执行如下:
控制台显示如下:显示错误
可通过断言进行预见
执行如下:
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
执行如下:
模块二:
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
执行如下:
进行调用:
导入方法1:直接导入
import test1
import test2
test1.say_hello() # 调用函数
BMW = test1.Car('BMW') # 调用类,进行对象的建立
print BMW
test2.say_hello()
B747 = test2.Plane('747')
print B747
执行如下:
控制台显示如下:
导入方法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
执行如下:
控制台显示如下:
导入方法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
此种方法导入是为了更加具体的进行导入,调用时更加方便,重新定义函数名是为了区别不同模块的同名函数
执行如下:
控制台显示如下:
模块调用时出现的问题
1.建立模块不能与系统中已有的模块重名
- python的解释器再导入模块的时候,会
1.搜索当前目录指定的模块文件,如果有就直接导入
2.如果没有,再搜索系统目录
因此建立模块不能与系统中已有的模块重名
示例:对随机数进行调用
定义一个与random相同的模块,在其中进行调用
import random
num = random(1,10)
print num
执行如下:
控制台显示如下:会报错
若是删除此模块
随意定义一与random不同的模块
import random
rand = random.randint(1,10)
print rand
执行如下:
控制台显示如下:,成功产生随机数
模块调用时,未进行函数调用,自动显示结果
- 在进行模块调用时,我们仅仅调用了模块,没有想对其内容进行操作,但是,模块中的各项被调用了。为了避免这种情况的发生,我门可以用控制语句对被调用模块的内容进行限制
name属性
name属性可以做到,测试模块的代码只在测试情况下被运行,二再导入时不会被运行
name是python的一个内置属性,记录着一个字符串
如果是被其他文件导入时,name就是模块名
如果是当前执行的程序,name就是main
模块 _ name _
def demo():
print 'Hello'
print 'Surprise!!'
demo()
print __name__
执行如下:
控制台结果如下:
跨模块调用
调用模块:
import __name__
执行如下:
控制台显示如下:
我们仅仅调用了模块,没有想对其内容进行操作,但是,模块中的各项被调用了
为了避免这种情况的发生,我门可以用控制语句对被调用模块的内容进行限制
__name__2 模块:
def demo():
print 'Hello'
if __name__ == '__main__':
print 'Surprise!!'
demo()
执行如下:
控制台显示如下:
对其进行调用
调用模块
import __name__2
执行如下:
控制台显示如下: