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语句
这里写图片描述
通过错误类型,可对其进行抓取,让程序继续执行


 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

执行如下:
这里写图片描述
控制台显示如下:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Buster_ZR/article/details/81181927