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)))

原文地址:https://www.cnblogs.com/scott-lv/p/7469211.html