python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > pycharm debug调试异常,Python错误处理

pycharm的debug调试以及异常,Python中错误的处理过程

作者:Make_magic

这篇文章主要介绍了pycharm的debug调试以及异常,Python中错误的处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

第一次写关于pycharm的debug调试以及python代码运行报错处理的帖子,错误地方请大家指出。

第一个部分:pycharm的debug调试

作为一个非科班出生的学生,平时看代码的时候特别的难懂,这时候对代码debug单步调试可以很好的看代码的具体信息。让我们能够更加清晰的理解代码具体传递过程。

debug:我们在pycharm窗口的右上角可以看见这个小虫子(七星瓢虫)图标。

同时我们也可以右击鼠标,这时候也可以发现这个小虫子。

当然如果代码没有错误,点击小虫子和run(上图最左边的三角符号)运行是一样的效果。

如果我们想让它在某一行停下来,我们可以在某一行打断点(就在某一行旁边点击鼠标左键),如下图:这时候debug,代码运行从第一行到第12行,而第13行代码停止运行。

而Special Variables为特殊变量:在这里会显示运行结果,如下图。

Special Variables上边的结果为正常变量(如上图)

下边重点介绍几个按钮: 

1.step over(F8) 单步调试

在当前这个脚本安装代码顺序逐行运行,点击一下,就会在Variables显示运行结果,如下图但我按键盘F8键,蓝色行由17行跳转到18行,Variables和17行后边都会显示详细信息。

2.Step Into(F7) 单步调试

在单步执行时,遇到子函数就进入并且继续单步执行,有的会跳到源代码里面去执行。

如下图,我将第13行打上断点,当我按键盘键F7的时候直接跳入定义的函数中去,这时候蓝色行在迪行,我们可以看到第6行的详细信息。

3.Step Into My Code(Alt+Shift+F7快捷键)

在单步执行时,遇到子函数就进入并且继续单步执行,不会进入到源码中。所以Step Into My Code就我而言功能和Step Into比较相似,一般而言用处不大。 

4.Step Out(Shift+F8快捷键)

当我们运行代码进入了一个函数体中,看了几行代码懂这个函数体是什么意思了,我想要跳出当前函数体,返回调用此函数的代码行,即使用此功能即可。这个功能还是比较方便。 

5.Run to Cursor(Alt+F9)

如果我们打了多个断点的时候,我们按键盘F9键,直接从当前断点运行到下一个断点。如果只打了一个断点,直接运行到脚本结束。

当然我觉得用的最多的应该是Step Over(F7)和Step Into(F8)这两个键,这就是我对pycharm的debug调试功能的理解,有什么讲错了的地方请大家指出,谢谢!

第二部分:异常,Python 中错误的处理方式

这里边所用到的代码小例子是看b站视频所讲解的小例子。

当程序在运行时 Python 解释器遇到到一个错误,这时候就会停止程序的执行,并且提示一些错误信息,这就是异常。 

1.简单的捕获异常语法

我们可以增加 try(尝试) 来捕获异常。

捕获异常最简单的语法格式:

try:
    尝试执行的代码
except:
    出现错误的处理

try except 语句的执行流程如下:

我们执行 try (尝试)里面的代码块,这个时候是不确定这个代码能否正常执行。执行异常时系统会自动生成一个异常类型,并将该异常交给 Python 解释器。

Python 解释器收到异常对象,会通过except块来处理这个异常。

如果Python 解释器找不到处理异常的 except 块程序运行终止,Python 解释器也将退出。

小例子:

try:
    # 提示用户输入一个数字
    num = int(input("请输入数字:"))
except:
    print("请输入正确的数字")

这时候运行代码,输入正确数字9,会出现运行正常并程序运行结束

如果这个时候我输入一个汉字或者一个字母,这个时候会通过except块来处理这个异常。

2.错误类型捕获

在程序执行时遇到不同类型的异常,做出不同的响应,这个时候我们需要捕获错误类型是什么。

语法格式:

try:
    # 尝试执行的代码
    pass
except 错误类型1:
    # 针对错误类型1,对应的代码处理
    pass
except (错误类型2, 错误类型3):
    # 针对错误类型2 和 3,对应的代码处理
    pass
except Exception as result:
    print("未知错误 %s" % result)

我们可以用一个 except 块可以同时处理多种异常。

小例子:

try:
    num = int(input("请输入整数:"))
    result = 8 / num
    print(result)
except ValueError:
    print("请输入正确的整数")
except ZeroDivisionError:
    print("除 0 错误")

当我运行程序,输入hah,结果如下:

当我运行程序,输入0,结果如下:

显然不同类型的错误,运行后通过except块来处理这个异常的类型也不一样。

当然在开发时,要预判到所有可能出现的错误,还是有一定难度的。这时候可以使用捕获未知错误,语法如下:

except Exception as result:
    print("未知错误 %s" % result)

3.异常捕获的完整语法

当然为了能够处理复杂的异常情况,完整的异常语法如下:

try:
    # 尝试执行的代码
    pass
except 错误类型1:
    # 针对错误类型1,对应的代码处理
    pass
except 错误类型2:
    # 针对错误类型2,对应的代码处理
    pass
except (错误类型3, 错误类型4):
    # 针对错误类型3 和 4,对应的代码处理
    pass
except Exception as result:
    # 打印错误信息
    print(result)
else:
    # 没有异常才会执行的代码
    pass
finally:
    # 无论是否有异常,都会执行的代码
    print("无论是否有异常,都会执行的代码")
try:
    num = int(input("请输入整数:"))
    result = 8 / num
    print(result)
except ValueError:
    print("请输入正确的整数")
except ZeroDivisionError:
    print("除 0 错误")
except Exception as result:
    print("未知错误 %s" % result)
else:
    print("正常执行")
finally:
    print("执行完成,但是不保证正确")

4.异常的传递

当函数/方法执行出现异常,会将异常传递给函数/方法的调用一方,如果传递到主程序,仍然没有异常处理,程序才会被终止。在开发中,可以在主函数中增加异常捕获,而在主函数中调用的其他函数,只要出现异常,都会传递到主函数的异常捕获中,这样就不需要在代码中,增加大量的异常捕获,能够保证代码的整洁。

小例子:

def demo1():
    return int(input("请输入一个整数:"))

def demo2():
    return demo1()

try:
    print(demo2())
except ValueError:
    print("请输入正确的整数")
except Exception as result:
    print("未知错误 %s" % result)

我尝试在三个地方输入:

def demo1():
    # try:
     return int(input("请输入一个整数:"))
    # except:
    #     pass

def demo2():
    # try:
        return demo1()
    # except:
    #     pass

# try:
demo2()
    # print(demo2())
# except ValueError:
#     print("请输入正确的整数")
# except Exception as result:
#     print("未知错误 %s" % result)

看错三步法

1.看line后面的数字,表示在哪一行犯错了,快速定位

2.看列出的这行代码,准确定位

3.报错原因:TypeError这一行就是阐释为什么错了

其实我认为在最后一句报错那个地方去处理就行。

但是额,对于底下有很多行报红,这里我也是不太清楚,只能按照异常传递试,如果说错了麻烦大家指出我的错误,并且希望大家也说说多行报红该怎么去看这种错误,谢谢大家

异常分类

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文