python 异常处理

一 什么是异常

异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),

在python中,错误触发的异常如下

错误分成两种

1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)

#语法错误示范一
if
#语法错误示范二
def test:
    pass
#语法错误示范三
class Foo
    pass
#语法错误示范四
print(haha)

2.逻辑错误

#TypeError:int类型不可迭代
for i in 3:
    pass
#ValueError
num=input(">>: ") #输入hello
int(num)

#NameError
aaa

#IndexError
l=['egon','aa']
l[3]

#KeyError
dic={'name':'egon'}
dic['age']

#AttributeError
class Foo:pass
Foo.x

#ZeroDivisionError:无法完成计算
res1=1/0
res2=1+'str'

二 异常的种类

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x

IOError 输入/输出异常;基本上是无法打开文件

ImportError 无法引入模块或包;基本上是路径问题或名称错误

IndentationError 语法错误(的子类) ;代码没有正确对齐

IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

KeyError 试图访问字典里不存在的键

KeyboardInterrupt Ctrl+C被按下

NameError 使用一个还未被赋予对象的变量

SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)

TypeError 传入对象类型与要求的不符合

UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它

ValueError 传入一个调用者不期望的值,即使值的类型是正确的

三 异常处理

为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理

 

如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理

#基本语法为
try:
    被检测的代码块
except 异常类型:
    try中一旦检测到异常,就执行这个位置的逻辑

平常报错

while True:
    num1 = input('num1:')
    num2 = input('num2:')
    num1 = int(num1)
    num2 = int(num2)
    result = num1 + num2

    break
    
'''
num1:alex
num2:123
Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/ss/SSS/day7/S13 面向对象/异常处理1.py", line 10, in <module>
    num1 = int(num1)
ValueError: invalid literal for int() with base 10: 'alex'
'''

四 try..except...详细用法

默认情况下会执行try: 里面的代码  如果try:里面的代码不执行的 except里面代码不执行

如果try里面的代码报错了,会执行except里面代

while True:
    num1 = input('num1:')
    num2 = input('num2:')
    try:
        num1 = int(num1)
        num2 = int(num2)
        result = num1 + num2

    # e 就是封装的错误信息
    except Exception as e:
        print('出现异常,信息如下:')
        print(e)
     
    break   
'''
num1:alex
num2:123
出现异常,信息如下:
invalid literal for int() with base 10: 'alex'
'''
ValueError
while True:
    num1 = input('num1:')
    num2 = input('num2:')
    try:
        num1 = int(num1)
        num2 = int(num2)
        result = num1 + num2

    # e 就是封装的错误信息
    except ValueError as e:
        print('出现异常,信息如下:')
        print(e)

    break

定义多种错误类型

while True:
    num1 = input('num1:')
    num2 = input('num2:')
    try:
        li = [1,2,3]
        print(li[4])
        num1 = int(num1)
        num2 = int(num2)
        result = num1 + num2

    # e 就是封装的错误信息
    except ValueError as e:
        print('出现异常,信息如下:')
        print(e)
    except IndexError as e:
        print('出现异常,信息如下:')
        print(e)

    break

'''
num1:alex
num2:a
Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/ss/SSS/day7/S13 面向对象/异常处理4.py", line 12, in <module>
    print(li[4])
IndexError: list index out of range
'''

'''
num1:alex
num2:123
出现异常,信息如下:
list index out of range
'''

一次性捕获所有错误

Exception 要放在错误类型 的最后
while True:
    num1 = input('num1:')
    num2 = input('num2:')
    try:
        li = [1,2,3]
        print(li[4])
        num1 = int(num1)
        num2 = int(num2)
        result = num1 + num2

    # e 就是封装的错误信息
    except ValueError as e:
        print('出现异常,信息如下:')
        print(e)
    except IndexError as e:
        print('出现异常,信息如下:')
        print(e)
        
    # 捕获所有错误
    except Exception as e:
        print('出现异常,信息如下:')
        print(e)

    break

 异常处理完整代码块

try:
    pass
except ValueError as e:
    print(e)
except Exception as e:
    print(e)
else:
    pass
finally:
    pass

'''
有报错执行 except
都不报错 执行else
finally 不管报错 不报错都执行

'''

try:
    print("helo")
except ValueError as e:
    print(e)
except Exception as e:
    print(e)
else:
    print("正常")
finally:
    print("不管报错 不报错都执行")

'''
helo
正常
不管报错 不报错都执行

'''

主动触发异常

raise Exception

执行 except Exception as e:

    print(e) 语句   = 主动错误一下

try:
    raise Exception("主动错误一下")
    print("123")
except ValueError as e:
    print(e)
except Exception as e:
    print(e)
else:
    pass
finally:
    pass

# 主动错误一下

自定义异常

'''
写一个类名为MikeException 的异常
self.message = msg = “我的异常”
MikeException('我的异常') 把 “我的异常” 传进去

'''
class MikeException(Exception):
    def __init__(self, msg):
        self.message = msg

    def __str__(self):
        return self.message


try:
    raise MikeException('我的异常')


except MikeException as e:
    print(e)

'''
print(e) 先执行 str方法
    def __str__(self):
        return self.message
        
所以最后打印 "我的异常"

'''

# 我的异常

断言

# 如果条件不成立 报错
assert 1==2

'''
Traceback (most recent call last):
  File "C:/Users/Administrator.QH-20170325TNQR/PycharmProjects/SSSSS/SS/day7/S13 面向对象/异常处理8 断言.py", line 8, in <module>
    assert 1==2
AssertionError
'''
assert 1==1
# 如果条件成立 不报错

assert 1==1
原文地址:https://www.cnblogs.com/mingerlcm/p/8534869.html