首页 > 编程语言 >PYTHON 异常处理

PYTHON 异常处理

时间:2022-12-09 12:12:55浏览次数:41  
标签:... Exception PYTHON except try 处理 print 异常

1.1 异常处理

有时可将程序错误(Error)称作程序异常(Exception)。

  • 出现错误程序终止。
  • 出现异常程序终止,也可以捕捉异常和撰写异常处理程序,处理完程序可以继续运行。

1.1.1 除数为0的异常

>>> 3 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

程序终止,打印出现异常的信息(除0错误)

1.1.2 异常处理程序

try:
    指令 # 可能发出异常
except [异常类型]:
    异常处理程序

执行过程:

  • try代码块:指令可能会抛出异常
  • except代码块:每个try可以跟多个except代码块,用于处理所有可能抛出的异常。异常如果省略了类型,则会捕捉所有的异常,如果指定异常类型,则会捕捉该类型异常及子类异常。
def division(x,y):
    try:
        return x / y
    except ZeroDivisionError:
        print("除数不能为零")
    except TypeError as e:  # 异常对象
        print(e)

division(3,0)  # 除数不能为零
division("a","b")  # unsupported operand type(s) for /: 'str' and 'str'\

except 后面可以写成as 异常对象名的方式,之后处理时可输出异常对象的信息。

1.1.3 try - except - else

try:
    ...
except 异常对象:
    ...
else:
    没有发生异常时执行这个代码块。
filename = "d:/2txt"
try:
    with open(filename) as fp:
        data = fp.read()
except FileNotFoundError:
    print("未找到文件:{}".format(filename))
else:
    print(data)

如果找到文件了,读取数据并显示,未找到打印未找到。

1.2 常见的异常对象

异常类型 说明
AttributeError 对象没有这个属性(
Exception 通用异常父类,它的父类是BaseException
FileNotFoundError 打不到文件
IOError 在输入输出时发生错误
IndexError 下标越界
KeyError 在映射中没有这个键
MemoryError 请求内存出错
NameError 对象名称未声明
SyntaxError 语法错误
SystemError 系统错误
TypeError 数据类型错误
ValueError 传入无效参数
ZeroDivisionError 除数为0

1.3 多重捕获

try:
    ...
except 异常对象1:
	...
except 异常对象2:
    ...
    

except可以是多个。注意:如果有父子关系的异常,要子类异常在前,父类异常在后,否则子类异常永远不会捕获到异常。

多重捕获多个异常的另一种方法:

try:
    ...
except(异常类型1, 异常类型2, ...):
    ...

如:

def f(a, b):
    try:
        return a / b
    except(ZeroDivisionError, TypeError) as e:
        print(e)


f(3, 0)
f(3, "a")

1.4 捕获所有异常

try:
    ...
except:
    ...

except后面没有跟任意类型。

1.5 抛出自定义的异常

raise Exception("异常信息")
class LoginError(Exception):
    def __init__(self, message):
        super().__init__(message)


def login(username, password):
    if username == 'admin' and password == 'admin':
        return True
    else:
        raise LoginError("用户名或密码错误")  # 抛出异常信息


try:
    login("admin","admin")
except LoginError as e:
    print(e)
else:
    print("登录成功")

1.6 异常堆栈跟踪信息

出现错误时会显示堆栈信息,定位错误文件及原因,可以把这个信息写入文件中。

traceback.format_exc() # 打印出错信息
try:
    raise Exception("出错啦!")
except Exception as e:
    print(e) # 出错啦!
    
# 打印:出错啦!


import traceback

try:
    raise Exception("出错啦!")
except Exception as e:
    traceback.print_exc() # 打印堆栈信息
    
'''
Traceback (most recent call last):
  File "D:\develop\school\main.py", line 4, in <module>
    raise Exception("出错啦!")
Exception: 出错啦!
'''   



可以把这个信息写入文件 , 用traceback.format_exc() 返回信息

import traceback

try:
    raise Exception("出错啦!")
except Exception as e:
    with open("d:/err.txt", "a") as f:
        f.write(traceback.format_exc())

1.7 资源释放

try:
    ...
except [异常类型n]:
    ...
finally:
    ...

finally必须放在最后,无论是否发生异常都会执行。

对于有些编程需要手动释放资源的,可以放在这里。

1.8 自定义异常类

class 异常类名(Exception):
    def __init__(self, message):
        super().__init__(message)

1.9 断言

断言用于程序的调试,使用的很少。

assert 表达式 , '断言信息'

如果表达的值为False,则抛出断言信息,相当于 raise AssertionError('error')

a = 0
assert a > 0, "a不能小于0"

'''
Traceback (most recent call last):
  File "D:\develop\school\main.py", line 2, in <module>
    assert a > 0, "a不能小于0"
AssertionError: a不能小于0
'''

标签:...,Exception,PYTHON,except,try,处理,print,异常
From: https://www.cnblogs.com/three-sheep/p/16968551.html

相关文章