☰
Python异常处理机制
2026/10/18 14:42:46 网站建设 项目流程

1 错误与异常

  • 错误:代码本身有语法错误,解释器无法执行代码。无法通过异常处理机制解决。
  • 异常:代码在语法上没问题,但执行过程中出现了问题。可以通过异常处理机制解决。
  • 异常示例
    • # 错误:代码本身有语法错误,解释器无法执行代码。无法通过异常处理机制解决。# 异常:代码在语法上没问题,但执行过程中出现了问题。可以通过异常处理机制解决。# 常见异常# 1.ZeroDivisionError:除数为零num1=199num2=0result1=num1/num2print('result1:',result1)# 2.TypeError:数据类型错误num1=199num2='100'result2=num1+num2print('result2:',result2)# 3. AttributeError:属性错误## 3.1 示例1classPerson:def__init__(self,name,age):self.name=name self.age=age p1=Person('张三',18)print('p1.name:',p1.name)print('p1.age:',p1.age)print('p1.gender:',p1.gender)## 3.2 示例2nums=[10,30,40]nums.add(60)# 4. IndexError:索引错误nums=[10,20,30,40]print('nums[4]:',nums[4])# 5. NameError:名称错误print('name:',name)# 6 KeyError:键错误dict1={'a':1,'b':2,'c':3}print(dict1['d'])# 错误:Key KeyError: 'd'# 7. ValueError:值错误num1=int('hello')print('num1:',num1)
  • Python中异常类的继承关系 官方文档

2 异常处理

  • 程序运行过程中出现的异常,如果得不到处理,那程序就会立即崩溃,导致后续代码无法执行。
  • 异常处理不是让异常消失,而是将异常捕获到,随后根据异常的具体情况,来执行指定的逻辑。

2.1 捕获所有异常

  • 将可能出现异常的代码放在try中,出现异常后的处理代码写在except中。
  • 如果try中的代码出现异常,那try中的后续代码不会执行,并自动跳转到except中。
  • 如果try中的代码没有异常,那except中的代码就不会执行。
  • 无论是否发生异常,try-except后面的代码都会继续执行。
  • 直接写except捕获到Python中所有的异常 。实际开发中不推荐这样做。
  • 示例代码
    • print('这是一个简单的加法计算器')try:a=int(input('请输入第一个数字: '))b=int(input('请输入第二个数字: '))result=a/bprint(f'{a}/{b}={result}')print('try结束')except:print('except结束')print('程序结束')

2.2 捕获指定类型异常

  • 示例代码
    • print('这是一个简单的加法计算器')try:a=int(input('请输入第一个数字: '))b=int(input('请输入第二个数字: '))result=a/bprint(f'{a}/{b}={result}')print('try结束')exceptZeroDivisionError:print('除数不能为0')exceptValueError:print('输入的不是数字')print('程序结束')

2.3 多个except

  • 示例代码
    • print('这是一个简单的加法计算器')try:a=int(input('请输入第一个数字: '))b=int(input('请输入第二个数字: '))result=a/bprint(f'{a}/{b}={result}')print('try结束')exceptException:# 除0异常匹配到这个异常print('程序异常')exceptZeroDivisionError:# 这个异常就不会触发print('除数不能为0')exceptValueError:print('输入的不是数字')print('程序结束')

2.4 获取异常具体信息

  • 示例代码
    • print('这是一个简单的加法计算器')try:a=int(input('请输入第一个数字: '))b=int(input('请输入第二个数字: '))print(x)result=a/bprint(f'{a}/{b}={result}')print('try结束')exceptZeroDivisionError:# 这个异常就不会触发print('除数不能为0')exceptValueError:print('输入的不是数字')exceptExceptionase:# 除0异常匹配到这个异常print('程序异常:',e)print('异常类型:',type(e))print('异常参数:',e.args)print('异常文件:',e.__traceback__.tb_frame.f_code.co_filename)print('异常行号:',e.__traceback__.tb_lineno)importtracebackprint('traceback.format_exc: ',traceback.format_exc())print('程序结束')

2.5 捕获不同异常

  • 示例代码
    • print('这是一个简单的加法计算器')try:a=int(input('请输入第一个数字: '))b=int(input('请输入第二个数字: '))result=a/bprint(f'{a}/{b}={result}')print('try结束')except(ZeroDivisionError,ValueError,Exception)ase:ifisinstance(e,ZeroDivisionError):print('除数不能为0')elifisinstance(e,ValueError):print('输入的不是数字')else:print('程序异常:',e)print('程序结束')

2.6 完整写法

  • try:尝试去做可能会出现异常的事情。
  • except:出现异常时的处理(出现异常时怎么补救)。
  • else:如果一切顺利(没有异常出现)要做的事。
  • finall:无论有没有异常,都要做的事。
  • 示例代码
    • # 1.try:尝试去做可能会出现异常的事情。# 2.except:出现异常时的处理(出现异常时怎么补救)。# 3.else:如果一切顺利(没有异常出现)要做的事。# 4.finall:无论有没有异常,都要做的事。print('这是一个简单的加法计算器')try:a=int(input('请输入第一个数字: '))b=int(input('请输入第二个数字: '))result=a/bprint(f'{a}/{b}={result}')print('try结束')except(ZeroDivisionError,ValueError,Exception)ase:ifisinstance(e,ZeroDivisionError):print('除数不能为0')elifisinstance(e,ValueError):print('输入的不是数字')else:print('程序异常:',e)else:print('try中代码没有任何异常')finally:print('finally结束')print('程序结束')

3 手动抛出异常

  • 当程序遇到不符合预期情况时,可以使用raise语句手动触发(抛出)异常。
  • 示例代码
    • # 当程序遇到不符合预期情况时,可以使用raise语句手动触发(抛出)异常。try:age=int(input("请输入年龄:"))if18<=age<=120:print('成年')elif0<=age<18:print('未成年')else:# 抛出异常,触发异常处理机制raiseValueError("年龄必须在0到120之间")exceptExceptionase:print(f'输入错误:{e}')

4 异常的传递机制

  • 如果异常没有被当前代码块所捕获处理,那该异常就会沿着调用链,逐层传递给其调用者。
  • 如果所有调用者,都没有捕获该异常,那最终程序将因【未处理异常】而意外终止。
  • 示例代码
    • # 如果异常没有被当前代码块所捕获处理,那该异常就会沿着调用链,逐层传递给其调用者。# 如果所有调用者,都没有捕获该异常,那最终程序将因【未处理异常】而意外终止。deftest1():print('***********test1开始************')result='100'+2print('***********test1结束************')deftest2():print('***********test2开始************')test1()print('***********test2结束************')deftest3():print('***********test3开始************')try:test2()exceptExceptionase:print(f'异常信息:{e}')print('***********test3结束************')test3()

5 自定义异常类

  • 由开发人员自己定义一个异常类,用来表示代码中“更具体、更有业务含义”的异常。
  • 具体规则:定义一个类(类名通常以Error结尾),继承Exception类或它的子类。
  • 示例代码
    • # 由开发人员自己定义一个异常类,用来表示代码中“更具体、更有业务含义”的异常。# 具体规则:定义一个类(类名通常以Error结尾),继承Exception类或它的子类。classSchoolNameError(Exception):def__init__(self,msg):super().__init__('【校名异常】'+msg)defcheck_school_name(name):iflen(name)>10:raiseSchoolNameError('学校名过长')else:print('学校名是合法的')try:check_school_name('ShaanXi University')exceptSchoolNameErrorase:print(f'程序异常:{e}')

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询