zoukankan      html  css  js  c++  java
  • 17.异常处理/模块与包

    异常处理

    分成两种:

    1. 由语法上的错误引发的异常
    2. 逻辑上的错误引发的异常

    对于语法上的异常,应该实在程序执行前就改正
    对于逻辑上的错误,尽量使用if来预防异常
    对于逻辑上无法预知的错误应该用try….except…来处理

    基本语法

    try:
        #被检测的代码块
    except 异常类型:
        #try中一旦检测到异常,就执行这个位置的逻辑
    try:
        xxxx
    except KeyError as x:
        #用as给error起一个别名
        print(x)
    

    范例:

    try:
        d = {'y':'123','x':'456'}
        print(d['z'])
    except KeyError as thi:
        print('the error is at',thi)

    >>>the error is at 'z'

    万能异常EXCEPTION

    try:
        d = {'y':'123','x':'456'}
        print(d['z'])
        print(c)
    
    except Exception as thi:
        print('the error is at',thi)

    语法上的异常SYNATAXERROR不应该被跳过,所以不包含在万能异常内

    多分支

    try:
        d = {'y':'123','x':'456'}
        # print(d['z'])
        print(c)
    
    except KeyError:
        print('this')
    except NameError:
        print('that')

    其他配合分支操作的语法

    try:
        d = {'y':'123','x':'456'}
        # print(d['z'])
        print(c)
    
    except KeyError:
        print('this')
    except NameError:
        print('that')
    
    # 除了以上错误,的其他情况
    else:
        print('there is no error')
    # 最后都会运行,通常会进行清理工作
    finally:
        print('finish this process')

    assert x == y断言*


    模块

    什么是模块?

    q1:
    黄康亮会飞吗?
    a1:
    不会
    q2:
    怎么样才能让黄康亮飞呢?
    a2:
    买一个喷气飞行背包

    喷气飞行背包就是一个模块。

    使用模块

    import xxx

    1. 创建xxx名称空间
    2. 执行模块xxx.py,如果当前程序中和模块中有相同的名称,在import的执行效果中,以xxx.py的名称空间优先
    3. 创建的名字xxx指向该名称空间,spam.名字的操作,都以spam为准

    在同一程序中,导入过的模块,再次导入,默认只有第一次导入的效果

    import spam
    print(spam.var)
    var = 'this is main var'
    print('main:',var)
    
    spam.read1()
    
    spam.change()

    运行结果:

    test firt from spam,spam is running
    var from spam global
    main: this is main var
    spam-->read1--var var from spam read function
    this var is global  var from spam global

    查看当前已经有的(导入的)模块:

    >>> import sys
    >>> print(sys.modules)

    将模块当成脚本去运行

    print(__name__)

    if __name__ == '__main__':
        print('文件作为脚本去执行')
        # 当他在当成模块去使用的情况中,这段代码不会运行
        # 一般的模块会把运行效果的代码直接放在这段代码中,用于直接运行的时候查看代码运行效果

    模块的搜索路径

    1. sys.modules导入模块,会先去内存查找。

    2. 再找内建

    3. 最后找sys.path中的路径
      Import sys
      print(sys.path)

    当需要添加默认路径的时候
    sys.path.append('path')

    包是一种通过使用.模块名来组织python模块名称空间的方式

    无论是import形式还是from…import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法
    在导入的时候,凡是带点的,点的左边都必须是一个包。

    from... import...语句中,import后面必须是单个对象,而不能使用xxx.xxx的语法

    在使用时,可以将包看成是一个大的模块,并且这个模块有自己的组织结构

    导入包就是在执行包的init文件

    __all__ = ['x','y','policy','versions']
    x = 1
    y = 2

    from glance import *
    这个*代表的就是__all__列表当中的名称 元素,如果不指定,这里保存的名称会指向当前包下的模块文件,如指定赋值,那么import的就是所指定的赋值。

    绝对导入和相对导入

    绝对导入:
    以glance(调用文件的同级包目录)为起始
    相对导入:
    用.(当前目录)或者..(上一级)的方式作为起始

    获取模块包所在路径
    import os
    print(os.path.dirname( os.path.abspath(file)))

  • 相关阅读:
    android异步更新UI的方法
    android中不同acitity之间进行数据传递(或者数据保存)
    android post数据到服务器端工具类(包括postjson字符串、键值对)
    android GestureDetector
    android实现圆角矩形
    android调用图库获取图片显示在img中
    (转)Http上传 vs Ftp上传
    (转)[VSTS] 让ADO.NET Entity Framework支持Oracle数据库
    (转)网站设计常用技巧收集
    (转)有了jQuery.Jcrop,选取美女的哪个部位你说了算
  • 原文地址:https://www.cnblogs.com/scott-lv/p/7469211.html
Copyright © 2011-2022 走看看