异常处理

异常处理: 

异常: 在程序中,程序正常执行过程按代码顺序一行一行执行,知道结束。若执行过程中出现了错误,导致代码无法执行完毕

    即代码执行中出现

错误种类: 1. 语法错误(python解释器在执行代码之前会检查语法错误,如果出现语法错误,不会执行代码)

      2. 逻辑错误: 例如用int 函数去转换字母, 定义变量没有给值,取字典中没有的key

异常的种类: 

1. AttributeError : 访问不存在的属性
2. IOError : 输入/输出异常,基本是无法打开文件
3. ImportError : 无法引入模块或包, 基本是路径问题或名称问题
4. IndentationError : 语法错误,缩进错误
5. IndexError : 下标超出序列边界
6. KeyError : 试图访问字典中不存在的键
7. KeyboardInterrupt: Ctrl+c 被按下
8. NameError : 变量名不存在
9. SyntaxError : 语法错误
10. UnboundLocalError: 试图访问一个还没有被设置的局部变量,基本是因为另一个同名的全局变量
    导致你以为在访问它
11. ValueError : 传入一个调用者不期望的值

更多异常:

ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

 异常信息构成: 1. traceback : 追踪信息

         2. 异常类型

        3. 异常值

排查错误的步骤:

  1、定位错误发生的位置

    如果没有调用模块和方法,全部代码都是自己写的,错误一定在最后一行

    如果调用了其他模块,可以检查最后几行代码

  2、查看异常类型和异常值

  3、如果没有异常信息,但程序就是不对,用排除法

异常处理:

  如果错误发生的条件是可预知的,需要用if进行处理,在错误发生之前

  如果错误发生时不可预知的,用到try ... except,在错误发生之后进行处理

  具体分一下集中情况:

try:   
    print('程序开始运行')
    a = int('aaaa')
    b = []
    b1 = b[1]
    print('程序结束')
except ValueError:
    print('发生错误')   

# 结果为

程序开始运行
发生错误


基础语法: 一旦检查到异常,就执行except后的代码
只能处理指定的异常情况,非指定的无法处理
# 多分支结构

try:
    print('程序开始运行')
    a = int('aaaa')
    b = []
    b1 = b[1]
    print('程序结束')
except IndexError as e:
    print(e)
except ValueError as e:
    print(e)

# 也可以统一处理
except(ValueError, IndexError) 将错误类型放在元组之中
# 万能异常(Exception 所有异常的父类)
try:
print('程序开始运行')
a = int('aaaa')
b = []
b1 = b[1]
print('程序结束')

except Exception as e: # 取别名获取异常对象,对象中包含了错误信息
print(e)

#结果为 程序开始运行
# invalid literal for int() with base 10: 'aaaa'

# 多分支和万能异常
try:
print('程序开始运行')
a = int('aaaa')
b = []
b1 = b[1]
print('程序结束')
except IndexError as e:
print(e)
except ValueError as e: # 多分支
print(e)

except Exception as e: # 万能异常
print(e)

# 因为有万能异常,程序永远不会报错
# try except else finally
try:
print('程序开始运行')
a = int('aaaa')
b = []
b1 = b[1]
print('程序结束')
except IndexError as e:
print(e)
except ValueError as e: # 多分支
print(e)

else:
print('如果try代码块中没有异常则执行else')

finally:
print('无论是否有异常,都会执行,一般都是进行清理工作')
# 主动抛出异常
try:
a = input('请输入整数')
if not a.isdigit():
raise TypeError('类型错误')
except Exception as e:
print(e)

# 自定义异常:

class MyException(Exception):
def __init__(self,msg):
self.msg = msg

def __str__(self):
return self.msg

try:
raise MyException('类型错误')

except MyException as e:
print(e)
总结: 用try...except 使程序更安全,不会因为一些小的错误而意外奔溃

 
原文地址:https://www.cnblogs.com/Afrafre/p/10148904.html