Python的错误和异常处理

本文阐述了编程中的语法错误(如括号不配对和变量未定义)、逻辑错误及异常(如除零错误和输入/输出错误),并展示了如何使用Python的异常处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、错误和异常

    编程中出现的错误大致可以分为两类:错误和异常。

(一)错误

    错误又可以分为两类:语法错误和逻辑错误。

1. 语法错误

    语法错误又称解析错误,它是指在编写程序时,程序的语法不符合Python语言的规范,导致程序无法被正确解析。这种错误通常由拼写错误、缺少冒号、括号不配对、语句以及引号等引起。

    例1 表达式括号不配对引发的语法错误。

图1 SyntaxError错误用例图

    例1中,第一行中是括号不配对,第二行变量名为关键词,引发SyntaxError。

    另外一切在编完程序到可以运行(通过编译),或者说通过编译之前发生的错误都归结到这里。

    例2 变量未定义就用于计算。

图1 NameError用例图

    例2中,s += i,相当于s = s + i,变量s没有定义,导致s += i无法执行,引发NameError。

    语法错误容易发现,改正前程序不能正常运行,系统会提供错误位置、错误类型和错误原因,用户可能根据这些信息修改错误。

2. 逻辑错误

    逻辑错误是指程序的逻辑不正确,导致程序无法按照用户期望的方式执行,或程序的算法不符合题目给出的逻辑。

    存在逻辑错误程序可以正常运行,但运行结果不正确。这种错误通常是由编程者的错误推理或理解偏差等引起的。比如已知三边求三角形面积,但程序却求的是周长等。

    例3 求闰年。如果年份能被4整除,但不能被100整除,那么这一年就是闰年。 如果年份能被100整除,但同时也能被400整除,那么这一年也是闰年。

   

    程序可以正常运行,但逻辑关系中的逻辑运算符用错,导致结果不正确。如只不能被100整除都将输出“闰年”。逻辑正确的程序如下:

 (二)异常

    异常也称运行时错误,是指在程序语法和逻辑都没有错误的情况下,程序在运行时出现的错误,这种错误可能是由于编程者的疏忽、系统资源不足或者外部因素引起的。常见的运行时错误有除零错误、索引错误、名称错误、输入/输出错误等。大多数异常不会被程序处理,从而导致程序中断,抛出错误。

    例4:两整数除法。

    正常输入,如输入6和4,程序正常输出“6÷4=1.5”,如图2(a)所示;当输入字母,如r,程序会抛出“ValueError”错误,如图2(b)所示;当输入带小数点的数,如45.5,程序也会抛出“ValueError”错误,如图2(c)所示。

图2 例4异常类型

    因此可以根据异常类型,结合出错原因,说明错误细节等进行异常的拦截与处理。

 ()异常的处理

    常见内置异常码见表1,表中列出了内置异常码及其含义(描述)

1 常见内置异常码表

    可以编写程序处理选定的异常。例5会要求用户一直输入内容,直到输入有效的整数。

    例5 输入一个整数,直到输入正确为止。

    当输入不正确会进入异常处理,输入正确会break跳出“死”循环。

1. Python异常处理

    在 Python 中,可以使用 try... except... else...finally 的方式来捕获异常并进行处理。其语法格式如下:

try:
    正常的操作    # 可能出现异常的代码块
except [异常类型]:
    发生异常,执行这块代码      # 如果在try部份引发了'异常类型'异常
except [异常类型,数据]:
    发生异常,执行这块代码      # 如果引发了'异常类型'异常,获得附加的数据
except[异常类型]:
    发生异常,执行这块代码
else:
    如果没有异常执行这块代码
finally:
    无论是否发生异常都将执行最后的代码

    其中,try 语句块中的代码可能会出现异常,如果出现了指定类型的异常 ExceptionName,就会执行相应的 except 子句中的代码块。如果没有出现异常,那么except子句不会执行,但会执行else子句中的代码块。而 finally 子句中的代码块无论如何都会在 try except 块执行完之后执行。

    例5 除数0的异常:

try:
    num1 = int(input('请输入第1个数:'))
    num2 = int(input('请输入第2个数:'))
    print(num1 / num2)
except ZeroDivisionError:
    print('第2个数不能为0!')

    可拦截除零,但不能拦截非法输入。

    多个except子句

try:
    num1 = int(input('请输入第1个数:'))
    num2 = int(input('请输入第2个数:'))
    print(num1 / num2)
except ValueError:
    print('请输入数字!')
except ZeroDivisionError:
    print('第2个数不能为0!')

   既可以拦截除零,也可以拦截非法输入。

   还可以不给except参数,空except捕捉所有异常,但区分不了异常。

try:
    num1 = int(input('请输入第1个数:'))
    num2 = int(input('请输入第2个数:'))
    print(num1 / num2)
except:
    print('出了问题!')

    as语句捕捉异常原因。

try:
   num1 = int(input('请输入第1个数:'))
   num2 = int(input('请输入第2个数:'))
   print(num1 / num2)
except Exception as err:
   print('出了问题!')
   print(err)      # 输出异常原因

    也可以将多个异常码元组作为except参数,一个except块捕捉多个异常。

try:
    num1 = int(input('请输入第1个数:'))
    num2 = int(input('请输入第2个数:'))
    print(num1 / num2)
except (ValueError, ZeroDivisionError):
    print('无效输入!')

 (四)触发异常

    raise语句支持强制触发指定的异常。例如:

    raise 唯一的参数就是要触发的异常。这个参数必须是异常实例或异常类(派生自 BaseException 类,例如 Exception 或其子类)

(五)用户自定义异常

    程序可以通过创建新的异常类命名自定义的异常。不论是以直接还是间接的方式,异常都应从Exception
类派生。

    异常类可以被定义成能做其他类所能做的任何事,但通常应当保持简单,它往往只提供一些属性,允许相应的异常处理程序提取有关错误的信息。

    一般异常命名都以 “Error” 结尾,类似标准异常的命名。本例命名为“CustomException”。

    许多标准模块定义了自己的异常,以报告他们定义的函数中可能出现的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值