python之异常机制与常见的异常类型(二)

作者 : admin 本文共3596个字,预计阅读时间需要9分钟 发布时间: 2024-06-17 共1人阅读

1、什么是异常?

异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
一般情况下,在Python无法正常处理程序时就会发生一个异常。
异常是Python对象,表示一个错误。
python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

2.python常见异常类型

所报错误缘由
zeroDivisionError除(或取模)零(所有数据类型)
IndexError序列中没有此索引(index)或者下标越界
KeyError映射中没有这个键
NameError未定义的变量
SyntaxErrorpython语法错误
ValueError传入无效参数
OSError操作系统异常(如:文件打开异常)
IOError输入输出异常
FileNotFoundError文件不存在异常
keyboardInterrupt键盘中断错误(如:Ctrl+c使得程序异常退出)
SystemExit由sys.exit()引发(唯一一个不被认为错误的异常)
RuntimeError(运行时错误)程序运行到一半,程序崩溃了
BaseException(Exception)所有异常的父类

3.try…except…else结构

如果try块中没有抛出异常,则执行else块,如果try中抛出异常,则执行except模块
except:捕获所有的异常

不带任何异常类型使用except,如下实例:

try:
    正常的操作
   ......................
except:
    发生异常,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

使用相同的except语句来处理多个异常信息,如下所示:

try:
    正常的操作
   ......................
except(Exception1[, Exception2[,...ExceptionN]]):
   发生以上多个异常中的一个,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

案例:

try:
    a=int(input('请输入第一个整数:'))
    b=int(input('请输入第二个整数:'))
    result=a/b
except BaseException as e:
    print('出错了',e)
else:
    print('计算结果为:',result)

4.try…except…else…finally

完整语法结构

try:
    可能触发异常的语句
except 错误类型1 [as 变量1]:
    处理语句1
except 错误类型2 [as 变量2]:
    处理语句2
except Exception  [as 变量3]:
    不是以上错误类型的处理语句(因为Exception 可接收所有异常)
else:
    未发生异常执行的语句
finally:
	无论是否发生异常都执行的语句

finally块无论是否发生异常都会执行,能常用来解释try块中申请的的资源

注意事项
①:as 子句是用于绑定错误对象的变量,可以省略。
②:except子句可以有一个或多个,用来捕获某种类型的错误。多个except结构时,捕获异常顺序按照先子类后父类(从小到大)。为避免遗漏可能出现异常,建议在最后增加BaseException。
③:else子句最多只能有一个。
④:finally子句最多只能有一个。

案例:

try:
    a=int(input('请输入一个数字:'))
    b=1/a
except ZeroDivisionError:  #0为分母的异常
    print('0不能做分母')
except ValueError:  #值异常,比如字母无法转换成int型
    print('你输入的不是数字')
except:  #捕获上面未捕获到的其他异常
    print('程序有错误')
else:  #如果程序正常运行完毕,没有保存,则执行else的语句
    print('程序未出现错误')
finally:  #无论程序是否出现异常,都会执行
    print('程序全部执行完毕')

访问异常信息
如果程序需要在 except 块中访问异常对象的相关信息,则可通过为异常对象声明变量来实现。
所有的异常对象都包含了如下几个常用属性和方法:
args:该属性返回异常的错误编号和描述字符串。
errno:该属性返回异常的错误编号。
strerror:该属性返回异常的描述宇符串。
with_traceback():通过该方法可处理异常的传播轨迹信息。

try:
    text = open("a.txt")
except Exception as e:
    # 访问异常的错误编号和详细信息
    print(e.args)
    # 访问异常的错误编号
    print(e.errno)
    # 访问异常的详细信息
    print(e.strerror)

5.raise抛出异常

(1)说明
当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行。

(2)作用
抛出一个错误,让程序进入异常状态。

(3)目的
在程序调用层数较深时,向主调函数传递错误信息要层层 return 比较麻烦,所以人为抛出异常,可以直接向外传递错误信息。

(4) 使用语法
①单独一个 raise
        在使用 raise 语句时可以不带参数,此时 raise 语句将会自动引发当前上下文激活的异常;否则,通常默认引发 RuntimeError 异常。
         作用:捕捉到了异常,但是又想重新引发它(传递异常),可以使用不带参数的raise语句。

raise
Traceback (most recent call last):
  File "C:/Users/chenh/PycharmProjects/pythonProject/main.py", line 1, in 
    raise
RuntimeError: No active exception to reraise

②:raise 异常类名称
        raise 后带一个异常类名称,表示引发执行类型的异常。

 raise ZeroDivisionError
Traceback (most recent call last):
  File "C:/Users/chenh/PycharmProjects/pythonProject/main.py", line 1, in 
    raise ZeroDivisionError
ZeroDivisionError

③:raise 异常类名称(描述信息)
         在引发指定类型的异常的同时,附带异常的描述信息。

raise ZeroDivisionError("除数不能为零")
Traceback (most recent call last):
  File "C:/Users/chenh/PycharmProjects/pythonProject/main.py", line 1, in 
    raise ZeroDivisionError("除数不能为零")
ZeroDivisionError: 除数不能为零

(5)应用举例

一. 我们手动让程序引发异常,很多时候并不是为了让其崩溃。事实上,raise 语句引发的异常通常用 try except(else finally)异常处理结构来捕获并进行处理。

try:
    num = input("输入一个数:")
    # 判断用户输入的是否为数字
    if not num.isdigit():
        raise ValueError("输入必须是数字")
except ValueError as e:
    print("引发异常:", repr(e))
输入一个数:three
引发异常: ValueError('输入必须是数字')

在该例程中,当输入的不是数字时,程序会进入 if 结构,并执行 raise 引发ValueError 异常。虽然在程序中使用 raise 语句引发了异常,但是由于位于 try 块中,抛出异常会被 try 捕获,并由 except 块进行处理。因此程序可以正常执行,并不会导致程序崩溃。
Python repr()函数
二. 在使用 raise 语句时可以不带参数

try:
    num = input("输入一个数:")
    # 判断用户输入的是否为数字
    if not num.isdigit():
        raise ValueError("输入必须是数字")
except ValueError as e:
    print("引发异常:", repr(e))
    raise
输入一个数:three
引发异常: ValueError('输入必须是数字')
Traceback (most recent call last):
  File "C:/Users/chenh/PycharmProjects/pythonProject/main.py", line 5, in 
    raise ValueError("输入必须是数字")
ValueError: 输入必须是数字

重点关注位于 except 块中的 raise,由于在其之前我们已经手动引发了 ValueError 异常,因此这里当再使用 raise 语句时,它会再次引发一次。

本站无任何商业行为
个人在线分享 » python之异常机制与常见的异常类型(二)
E-->