python的简单调试

python的简单调试

记得以前上大学时初次学C语言,常常是写代码十几分钟,改bug数小时,常常因为变量定义,分号,指针各种问题搞得头皮发麻,当时为了物理实验复杂计算编程序解决(那时候还不会matlab),结果往往是因为各种变量以及其中间变量的变量类型的定义就已经糊涂了,最后问题已经不是计算物理实验而是改程序bug,当然,现在看来,用C语言来进行科学计算不是不可以,只是太过繁琐,以至于往往把大部分精力用来调试程序而不是解决实际的问题。本想使用工具帮助更快的解决问题,结果却因为工具本身耗费大量精力以至于无法针对问题本身,这不是喧宾夺主了么。可见编程而言,程序的调试是十分重要的过程。
这章来讲程序的调试。
首先对于python而言,为了保证程序的正常运行,有时候需要我们主动抛出异常:

  • raise 关键字
  • exception 类的继承
  • exception函数的字符串

我们可以使用下面的类似语句抛出异常:
在这里插入图片描述
Exception中传入一个字符串,字符串可以自己定义,可以用一描述想要抛出的异常。
如果没有try-----except---- 语句覆盖异常的raise语句,那么程序运行到raise语句的时候就会崩溃不再继续往下
通常是调用该函数的代码知道如何处理异常,而不是该函数本身。所以你常常会看到 raise 语句在一个函数中,try 和 except 语句将其覆盖。

定义一个简单的打印函数:

def boxPrint(symbol,width, height):
    if len(symbol) != 1:
        raise Exception('Symbol must be a signle character string')
    if width <= 2:
        raise Exception("Wight must be greater than 2")
    if height <= 2:
        raise Exception("Height must be greater tahn 2")
    print(symbol*width)
    for i in range(height -2):
        print(symbol+(" "*(width-2))+symbol)
    print(symbol*width)
    return None

if __name__=="__main__":
    for sym,w,h in (('*',4,4),("0",20,5),("x",1,3),("zz",3,3)):
    #后面两个输入错误,使用try---except 保护程序,保护程序运行的同时不至于程序崩溃。
        try:
            boxPrint(sym,w,h)
           
        except Exception as arr:
        #捕获程序异常,并且打印
            print("an exception happened:"+str(arr))

运行结果:

反向跟踪字符串

如果 Python 遇到错误,它就会生成一些错误信息,称为“反向跟踪”。反向跟踪
包含了出错消息、导致该错误的代码行号,以及导致该错误的函数调用的序列。这
个序列称为“调用栈”。

def spam():
    bacon()
def bacon():
    raise Exception("This is the error message")

运行结果:
在这里插入图片描述
通过反向跟踪,可以知道报错在第44行,这是我们程序的入口在第44行,在其中使用了spam()函数,而spam()函数(在第26行)调用了bacon函数,而bacon()函数raise了错误,在第28行。
如果抛出的异常没有被处理,就会显示反向跟踪,也可以引入traceback模块,调用**traceback.format_exc()**得到其字符串形式

    import traceback

    try:
        raise Exception("This is the error message")
    except:
        errorFile = open("errorInfo.txt","w")
        errorFile.write(traceback.format_exc())
        errorFile.close()
        print('the traceback info was written to errorInfo.txt at {}'.format(os.getcwd()))
#

其中我们引入traceback模块,抛出错误Exception(“This is the error message”),随后将错误写入errorInfo.txt文件中,并使用os.getcwd()知道文件所在位置。而后我们根据目录可以找到errorInfo.txt文件,并发现里面已经保存了错误信息。

assert

assert同样用以保证代码正常,主要包含以下几个部分:

  • assert关键字
  • 条件(即求值为 True 或 False 的表达式)
  • 逗号
  • 当条件为False时显示的字符串

如:在这里插入图片描述
首先定义了一个变量status并为其赋值为”open",然而在实际中我们可能多次对该变量进行了引用有可能其中的值被改变了,为了保证其值不变,使用assert,如果status的值发生了变化就报错,这样可以防止在后续程序中由于变量值改变造成的程序崩溃,也利于我们查找问题原因。

缺点:实际使用中不能使用try…except… 处理assert

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃肉夹馍不要夹馍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值