Python异常处理和模块详解

本文介绍了Python的异常处理,模块,包,标准库。是Python系列文章的第7篇。


系列文章

【Python 基础】一文补齐Python基础知识
【趣学Python:B站四大恶人】一文掌握列表、元组、字典、集合
【Python进阶】一文掌握Python函数用法
【Python进阶】Python面向对象之类与对象详解
【Python进阶】Python面向对象之装饰器与封装
【Python进阶】Python面向对象之继承和多态详解
【Python进阶】Python异常处理和模块详解
【Python进阶】Python文件(I/O)操作详解


文章目录

  • 系列文章
  • 1. 模块(module)
    • 1.1 模块简介
    • 1.2 模块的创建
    • 1.3 包(Package)
    • 1.4 Python标准库
  • 2. 异常处理
    • 2.1 异常简介
    • 2.2 处理异常
    • 2.3 异常的传播
    • 2.4 异常对象
    • 2.5 抛出异常


1. 模块(module)

1.1 模块简介

  • 模块化,模块化指将一个完整的程序分解为一个一个小的模块。通过将模块组合,来搭建出一个完整的程序。
  • 不采用模块化,统一将所有的代码编写到一个文件中;采用模块化,将程序分别编写到多个文件中。
  • 模块化的特点:
    ① 方便开发
    ② 方便维护
    ③ 模块可以复用

1.2 模块的创建

  • 在Python中一个 py 文件就是一个模块,要想创建模块,实际上就是创建一个python文件。注意:模块名要符号标识符的规范

1.在一个模块中引入外部模块:
import 模块名 (模块名,就是python文件的名字,注意不要文件名后缀 .py
import 模块名 as 模块别名

2.在每一个模块内部都有一个__name__属性,通过这个属性可以获取到模块的名字

  • __name__属性值为 __main__的模块是主模块,一个程序中只会有一个主模块;主模块就是我们直接通过 python 执行的模块;
'''
test_model.py
'''
print('我是test_module模块')
print(__name__)
import test_module as test
print(test.__name__)
print(__name__)

模块导入:

可以只引入模块中的部分内容:

语法:from 模块名 import 变量,变量....

from m import Person
from m import test
from m import Person,test
也可以为引入的变量使用别名

语法:from 模块名 import 变量 as 别名

from m import test2 as new_test2

更一般的:

# 全部导入
from m import *

import xxx
import xxx as yyy
from xxx import yyy , zzz , fff
from xxx import *
from xxx import yyy as zz

1.3 包(Package)

  • 包也是一个模块;

  • 当我们模块中代码过多时,或者一个模块需要被分解为多个模块时,这时就需要使用到包;

  • 普通的模块就是一个 py 文件,而包是一个文件夹;

  • 包中必须要 __init__.py 文件,这个文件中可以包含有包中的主要内容;

  • __pycache__是模块的缓存文件;

  • py代码在执行前,需要被解析器先转换为机器码,然后再执行;所以我们在使用模块(包)时,也需要将模块的代码先转换为机器码然后再交由计算机执行;而为了提高程序运行的性能,python会在编译过一次以后,将代码保存到一个缓存文件中,这样在下次加载这个模块(包)时,就可以不再重新编译而是直接加载缓存中编译好的代码。


1.4 Python标准库

官方文档
在开发过程中,如果要实现某些基础的功能,可以先去Python标准库中查找相关的模块,如果有满足业务需求的,就不用自己再写了,可以直接使用Python标准库中提供的模块,提高开发效率。


  1. sys.argv
    获取执行代码时,命令行中所包含的参数
    该属性是一个列表,列表中保存了当前命令的所有参数
print(sys.argv)
  1. sys.modules
    获取当前程序中引入的所有模块
    modules是一个字典,字典的key是模块的名字,字典的value是模块对象
pprint.pprint(sys.modules)
  1. sys.path
    他是一个列表,列表中保存的是模块的搜索路径
pprint.pprint(sys.path)
  1. sys.platform
    表示当前Python运行的平台
print(sys.platform)
  1. sys.exit()
    函数用来退出程序
sys.exit('程序出现异常,结束!')
  1. os 模块让我们可以对操作系统进行访问
import os
  1. os.environ
    通过这个属性可以获取到系统的环境变量
pprint.pprint(os.environ['path'])
  1. os.system()
    可以用来执行操作系统的名字
os.system('dir')
os.system('notepad')

2. 异常处理

2.1 异常简介

程序在运行过程当中,不可避免的会出现一些错误,比如:使用了没有赋值过的变量、使用了不存在的索引、除0…这些错误在程序中,我们称其为异常。程序运行过程中,一旦出现异常将会导致程序立即终止,异常以后的代码全部都不会执行!

2.2 处理异常

程序运行时出现异常,目的并不是让我们的程序直接终止!

Python是希望在出现异常时,我们可以编写代码来对异常进行处理!


try语句:

    try:
        代码块(可能出现错误的语句)
    except 异常类型 as 异常名:
        代码块(出现错误以后的处理方式)
    except 异常类型 as 异常名:
        代码块(出现错误以后的处理方式)
    except 异常类型 as 异常名:
        代码块(出现错误以后的处理方式)
    else:
        代码块(没出错时要执行的语句)    
    finally:
        代码块(该代码块总会执行)    
  • try 是必须要有的,else 语句可有可无,exceptfinally 至少有一个。

  • 可以将可能出错的代码放入到 try 语句,这样如果代码没有错误,则会正常执行; 如果出现错误,则会执行 expect 子句中的代码,这样我们就可以通过代码来处理异常,避免因为一个异常导致整个程序的终止;

实例:

print('开始执行try语句···')
try:
    # try中放置的是有可能出现错误的代码
    print(10/0)
except:
    # except中放置的是出错以后的处理防暑
    print('哈哈哈,出错了~~~')
else:
    print('程序正常执行没有错误')    
print('执行结束!')

输出:

开始执行try语句···
哈哈哈,出错了~~~
执行结束!

2.3 异常的传播

当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再继续传播;如果函数中没有对异常进行处理,则异常会继续向函数调用处传播。如果函数调用处处理了异常,则不再传播;如果没有处理,则继续向调用处传播。直到传递到全局作用域(主模块)如果依然没有处理,则程序终止,并且显示异常信息。

def fn():
    print('Hello fn')
    print(a)
    print(10/0)

def fn2():
    print('Hello fn2')
    fn()

def fn3():
    print('Hello fn3')
    fn2()

fn3() 

当程序运行过程中出现异常以后,所有的异常信息会被保存一个专门的异常对象中,而异常传播时,实际上就是异常对象抛给了调用处,比如 :

  • ZeroDivisionError 类的对象专门用来表示除0的异常;
  • NameError 类的对象专门用来处理变量错误的异常;

在Python为我们提供了多个异常对象,官方文档。

使用builtins查询内置函数和变量的名称:

>>> import builtins
>>> dir(builtins)  
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
 'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
 'NotImplementedError', 'OSError', 'OverflowError',
 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',
 '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',
 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
 'zip']

2.4 异常对象

异常的捕获分为两种,捕获指定的异常和捕获所有异常。

  • 如果except后不跟任何的内容,则此时它会捕获到所有的异常;
  • 如果在except后跟着一个异常的类型,那么此时它只会捕获该类型的异常;
  • Exception 是所有异常类的父类,所以如果except后跟的是Exception,他也会捕获到所有的异常;
  • 可以在异常类后边跟着一个 as xx 此时 xx 就是异常对象;
print('异常出现前')
l = []
try:
    # print(c)
    # l[10]
    # 1 + 'hello'
    print(10/0)
except NameError:
    # 如果except后不跟任何的内容,则此时它会捕获到所有的异常
    # 如果在except后跟着一个异常的类型,那么此时它只会捕获该类型的异常
    print('出现 NameError 异常')

except ZeroDivisionError:
    print('出现 ZeroDivisionError 异常')

except IndexError:
    print('出现 IndexError 异常')

# Exception 是所有异常类的父类,所以如果except后跟的是Exception,他也会捕获到所有的异常
# 可以在异常类后边跟着一个 as xx 此时xx就是异常对象
except Exception as e :
    print('未知异常',e,type(e))

finally :
    print('无论是否出现异常,该子句都会执行')

print('异常出现后')

2.5 抛出异常

可以使用 raise 语句来抛出异常,raise 语句后需要跟一个异常类或异常的实例。

也可以自定义异常类,只需要创建一个类继承 Exception 即可;

class MyError(Exception):
    pass

def add(a,b):
    # 如果a和b中有负数,就向调用处抛出异常
    if a < 0 or b < 0:
        # raise用于向外部抛出异常,后边可以跟一个异常类,或异常类的实例
        # raise Exception    
        # 抛出异常的目的,告诉调用者这里调用时出现问题,希望你自己处理一下
        # raise Exception('两个参数中不能有负数!')  
        raise MyError('自定义的异常')
        
        # 也可以通过if else来代替异常的处理
        # return None
    r = a + b
    return r

print(add(-123,456)) 

参考:https://edu.aliyun.com/course/1782


你可能感兴趣的:(Python)