Python 异常处理

python 中异常捕获使用的关键字,try、except、finally。
try 里面放,可以引发异常的代码。
execpt 里面放处理异常的代码 finally 里面的代码,始终会在 try 执行之后,无论是否发送异常,都会执行。

0x01 try:...except

在 try 代码块中包含在执行过程中可能引发异常的语句,如果没有发生异常,则跳到 except 代码块执行,这就是异常捕获。异常捕获是通过try-except语句实现的,基本的try-except语句的语法如下:

try:
	<可能会引发异常的语句>
except[异常类型]:   #异常类型可以省略
	<处理异常>

image

try:
    while True:
        num1=input("请输入第一个数字:")
        num2=input("请输入第二个数字:")
        num=int(num1)/int(num2)
        print("{n1}÷{n2}={n3}".format(n1=num1,n2=num2,n3=num))
except Exception as e:
    print("异常:{}".format(e))
#输出结果为:
请输入第一个数字:0
请输入第二个数字:0
异常:division by zero

except Exception as e:表示捕获任意类型的异常。Exception 是 python 中所有内置异常的基类。

0x02 多个 except 模块

多条语句可能会引发多种不同的异常,对每一种异常都会采用不同的处理方式。针对这种情况,我们可以在一个 try 后面跟多个 except 代码块,语法如下:

try:
	<可能会引发异常的语句>
except 异常类型1:   #多个except代码块根据异常类型匹配到不同的except代码块
	<处理异常>
except 异常类型2:
	<处理异常>
...
except:   #省略异常类型的except代码块是默认的except代码块,它只能被放到最后,捕获上面没有匹配的异常类
	<处理异常>

示例代码如下:

try:
    while True:
        num1=input("请输入第一个数字:")
        num2=input("请输入第二个数字:")
        num=int(num1)/int(num2)
        print("{n1}÷{n2}={n3}".format(n1=num1,n2=num2,n3=num))
except ZeroDivisionError as e:
    print("除数不能为0异常:{}".format(e))
except ValueError as e:
    print("输入的数据不正确异常:{}".format(e))
except Exception as e:
    print("异常:{}".format(e))
#输出结果为:
请输入第一个数字:aa
请输入第二个数字:bb
输入的数据不正确异常:invalid literal for int() with base 10: 'aa'

0x03 finally

有时在 try-except 语句中会占用一些资源,例如打开的文件、网络连接、打开的数据库及数据结果集等都会占用计算机资源,需要程序员释放这些资源。为了确保这些资源能够被释放,可以使用 finally 代码块。

try:
	<可能会引发异常的语句>
except 异常类型1:
	<处理异常>
except 异常类型2:
	<处理异常>
...
except:
	<处理异常>
finally:
	<释放资源>

无论是 try 代码块正常结束还是 except 代码块异常结束,都会执行 finally 代码块。

i = input('请输入数字:')
n = 8888
try:
    result =n / int(i)
    print(result)
    print('{0}除以{1}等于{2}'.format(n,i,result))
except ZeroDivisionError as e:
    print("不能除以0,异常{}".format(e))
except ValueError as e:
    print("输入的是无效数字,异常{}".format(e))
finally:
    print('资源释放...')
输出结果为:
请输入数字:a
输入的是无效数字,异常invalid literal for int() with base 10: 'a'
资源释放...

0x04 自定义异常类

实现自定义异常类,需要继承 Exception 类或其他子类,之前遇到的 ZeroDivisionError 和 ValueError 异常都属于 Exception 的子类。
实现自定义异常类的示例代码如下:

class dingyiException(Exception):
	def __init__(self,message):   #构造方法,其中的参数message是异常描述信息
		super().__init__(message)   #调用父类构造方法,并把message传给父类构造方法

目前为止,我们接触到的异常都是由于解释器引发的。也可以通过 raise 语句手动引发异常。

class MyException(Exception):
    def __init__(self,message):
        super().__init__(message)
try:
    while True:
        num1=input("请输入第一个数字:")
        num2=input("请输入第二个数字:")
        num=int(num1)/int(num2)
        print("{n1}÷{n2}={n3}".format(n1=num1,n2=num2,n3=num))
except (ZeroDivisionError,ValueError) as e:
    raise MyException("异常:{}".format(e))
except Exception as e:
    raise MyException("报异常了,异常:{}".format(e))
#输出结果为:
请输入第一个数字:1
请输入第二个数字:0
Traceback (most recent call last):
    num=int(num1)/int(num2)
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
    raise MyException("异常:{}".format(e))
__main__.MyException: 异常:division by zero
posted @ 2026-02-03 21:24  77板烧鸡腿堡  阅读(0)  评论(0)    收藏  举报