python错误分析调试代码与异常处理

参考来源 https://ceshiren.com/t/topic/27678
python里的错误、异常 https://ceshiren.com/t/topic/26203

1.错误分析

定位错误方法
分析方法:
(1)大多都是一些语法性的错误,通过错误提示信息,就可以快速定位和解决错误。
(2)有时候通过报错信息,并不能直接定位出错误,要通过报错信息,及程序的上下文逻辑来分析真正的报错原因。


2.调试方法

2.1 print信息调试

很多人由于英文不太好,在查看报错信息时很吃力,也可以通过 print() 函数,自行输出信息来定位错误位置,虽然这种方式可以解决问题,但还是要慢慢学习,掌握如何查看报错提示。

2.2 debug调试

可以通过 PyCharm 的 debug 功能来调试程序,通过 debug功能,还可以监控程序的执行过程。
(1)程序断点: 断点的作用是在debug调试程序时,遇到断点程序就会暂停执行,通过点击控制按钮,控制程序向下执行。
(2)调试控制: 程序打好断点后,点击debug即可进入debug模式,程序遇到断点就会暂停执行,此时就需要通过控制按钮来控制程序的执行

pycharm调试按钮

A.横向按钮

  • Step Over: 步过按钮,将函数做为一条语句执行,不进入函数内部执行。
  • Step Into: 单步执行,会进入到函数内部逐条执行代码。
  • Step Into My Code: 单步执行,只进入自定义函数内部,不会进入系统函数内部。
  • Step Out: 步出按钮,跳出当前函数体,返回到此函数调用位置
  • Run to Cursor: 运行到光标处,当调试程序时,如果某一行没有打断点,又想暂停,可以将光标移动到目标行,点击该按钮
  • Evaluate Expression: 评估表达式,高级用法,可以在调试过程中查看程序的中间过程,比如查看参数 n 的类型。

B.竖向按钮

  • Rerun main: 重新运行 debug 功能
  • Modify Run Configuration: 修改运行配置
  • Resume Program: 继续执行,运行到下一断点处,如果没有,程序运行结束
  • Stop main: 停止 Debug
  • View Breakpoints: 显示程序中所有的断点。
  • Mute Breakpoints: 让所有断点失效,使用后所有断点为灰色,debug时,代码不会在断点处暂停。
  • Pin Tab: 钉住当前调试窗口标签,防止关闭。

3.python异常处理

定义: 编写程序时,即使语句或表达式使用了正确的语法,执行时仍可能触发错误。执行时检测到的错误称为异常,大多数异常不会被程序处理,程序会中断运行,并抛出异常信息。——如果不想发生异常时,程序被中断执行,可以编写程序处理选定的异常。

3.1异常捕获

1、Python 使用 try/except语句捕捉异常。
try/except 语句用来检测 try 语句块中的错误,从而让 except 语句捕获异常信息并处理。—— 如果你不想在异常发生时结束你的程序,只需在try里捕获它。

file = open("data.txt","r")
try:
    # 写入数据时可能会有问题
    # file.write("写入的数据")
    # print(a)
    # print(3 / 0)
    # print([][10])
    print("hello" + 100)
except IOError as err:
    print("文件不能写入", err)
except NameError:
    print("标识符没有定义")
except ZeroDivisionError:
    print("除数不能为0")
except IndexError:
    print("下标越界了")
except Exception:
    print("程序运行出错,请检查代码")
file.close()

原理:
如果在执行 try 子句时发生了异常,则跳过该子句中剩下的部分。 然后,如果异常的类型和 except 关键字后面的异常匹配,则执行 except 子句,然后继续执行 try…except 语句之后的代码。

说明:

  • 如果一段代码可能会发生多种异常,并想在程序中都想处理,可以使用多个 except 分别捕捉异常。
  • 可以捕捉 Exception异常类型来处理所有的异常,如果有多个时, Exception必须放在最后捕捉该异常,否则无法处理到其它异常。

(1)else操作
Python 使用 else 在处理代码无异常时的后续操作。

try:
    n = input("请输入一个数字:")
    num = int(n)
except Exception:
    print("元素无法转换为数字")
else:
    print("转换后成功",num)

(2)finally操作
Python 使用 finally 处理无论异常是否发异,都要执行的代码,一般用来完成清理工作。

try:
   file = open("data.txt","r")
   # file.write("A")
except Exception:
    print("文件操作报错")
finally:
    print("文件已关闭")
    file.close()

例子

def operation(number_1,symbol,number_2):
    match symbol:
        case "+":
            return number_1 + number_2
        case "-":
            return number_1 - number_2
        case "*":
            return number_1 * number_2
        case "/":
            if number_2 == 0:
                raise Exception("除数不能为0!")
            else:
                return number_1 / number_2
        case _:
            raise Exception(f"您输入的运算符{symbol}有误!")
def calculator():
    try:
        number_1 = int(input("请输入第一个数字:\n"))
        symbol = input("请输入+ - * /其中一个运算符:\n")
        number_2 = int(input("请输入第二个数字:\n"))
    except Exception:
        print("请输入整数数字!")
    else:
        try:
            result = operation(number_1, symbol, number_2)
        except Exception as err:
            print(err)
        else:
            print(f"您输入的计算结果为:{result}")

if __name__ == '__main__':
    calculator()

2、抛出异常 raise

import random
try:
    start = int(input('请输入一个整数作为起始值:'))
    end = int(input('请输入一个整数作为结束值:'))
    if start > end:
        raise ValueError('起始值不能大于结束值,请重新输入')
    random_num = random.randint(start,end)
    print('随机数是:',random_num)
except ValueError as ve:
    print('输入值有误')
    print(ve)
except Exception as e:
    print('发生一个错误:',e)