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

 更新时间:2024年01月29日 09:59:20   作者: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("无论是否有异常,都会执行的代码")
  • else:只有在没有异常时才会执行的代码。
  • finally: 无论是否有异常,都会执行的代码。
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.异常的传递

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

小例子:

  • 定义函数 demo1() 提示用户输入一个整数并且返回
  • 定义函数 demo2() 调用 demo1()
  • 在主程序中调用 demo2()
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这一行就是阐释为什么错了

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

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

异常分类

  • BaseException 所有异常的基类
  • Exception 常见错误的基类
  • ArithmeticError 所有数值计算错误的基类
  • Warning 警告的基类
  • AssertError 断言语句(assert)失败
  • AttributeError 尝试访问未知的对象属性
  • DeprecattionWarning 关于被弃用的特征的警告
  • EOFError 用户输入文件末尾标志EOF(Ctrl+d)
  • FloattingPointError 浮点计算错误
  • FutureWarning 关于构造将来语义会有改变的警告
  • GeneratorExit generator.close()方法被调用的时候
  • ImportError 导入模块失败的时候
  • IndexError 索引超出序列的范围
  • KeyError 字典中查找一个不存在的关键字
  • KeyboardInterrupt 用户输入中断键(Ctrl+c)
  • MemoryError 内存溢出(可通过删除对象释放内存)
  • NamerError 尝试访问一个不存在的变量
  • NotImplementedError 尚未实现的方法
  • OSError 操作系统产生的异常(例如打开一个不存在的文件)
  • OverflowError 数值运算超出最大限制
  • OverflowWarning 旧的关于自动提升为长整型(long)的警告
  • PendingDeprecationWarning 关于特征会被遗弃的警告
  • ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
  • RuntimeError 一般的运行时错误
  • RuntimeWarning 可疑的运行行为(runtime behavior)的警告
  • StopIteration 迭代器没有更多的值
  • SyntaxError Python的语法错误
  • SyntaxWarning 可疑的语法的警告
  • IndentationError 缩进错误
  • TabError Tab和空格混合使用
  • SystemError Python编译器系统错误
  • SystemExit Python编译器进程被关闭
  • TypeError 不同类型间的无效操作
  • UnboundLocalError 访问一个未初始化的本地变量(NameError的子类)
  • UnicodeError Unicode相关的错误(ValueError的子类)
  • UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类)
  • UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类)
  • UserWarning 用户代码生成的警告
  • ValueError 传入无效的参数
  • ZeroDivisionError 除数为零

总结

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

相关文章

  • 基于Python安装pyecharts所遇的问题及解决方法

    基于Python安装pyecharts所遇的问题及解决方法

    今天小编就为大家分享一篇基于Python安装pyecharts所遇的问题及解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python中selenium_webdriver下拉框操作指南

    Python中selenium_webdriver下拉框操作指南

    selenium 虽然过了这么多年,但是到目前为止依然是比较流行的自动化框架了,下面这篇文章主要给大家介绍了关于Python中selenium_webdriver下拉框操作的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • 使用Python批量删除MySQL数据库的全部外键

    使用Python批量删除MySQL数据库的全部外键

    这篇文章主要为大家详细介绍了如何使用Python批量删除MySQL数据库的全部外键,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • 使用python编写udp协议的ping程序方法

    使用python编写udp协议的ping程序方法

    下面小编就为大家分享一篇使用python编写udp协议的ping程序方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python for循环及基础用法详解

    Python for循环及基础用法详解

    这篇文章为大家介绍python for 循环,它常用于遍历字符串、列表、元组、字典、集合等序列类型,逐个获取序列中的各个元素
    2019-11-11
  • Python实现历史记录功能(实际案例)

    Python实现历史记录功能(实际案例)

    很多应用程序都有浏览用户的历史记录的功能,浏览器可以查看最近访问过的网页,现在我们制作了一个简单的猜数字的小游戏,添加历史记录功能,显示用户最近猜过的数字,如何实现呢?跟随小编一起看看吧
    2022-04-04
  • 基于PyScreeze实现截屏和定位功能

    基于PyScreeze实现截屏和定位功能

    PyScreeze 是一个开源的 Python 屏幕截图模块,适用于 Python 2 和 Python 3,该项目由开源技术专家 Al Sweigart 创建,旨在提供一个简单而强大的工具,用于屏幕截图以及图像识别功能,本文就给大家介绍了基于PyScreeze实现截屏和定位功能,需要的朋友可以参考下
    2025-04-04
  • Scrapy爬虫实例讲解_校花网

    Scrapy爬虫实例讲解_校花网

    下面小编就为大家带来一篇Scrapy爬虫实例讲解_校花网。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Python实现简单的猜单词小游戏

    Python实现简单的猜单词小游戏

    这篇文章主要为大家详细介绍了Python实现简单的猜单词小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • python3对接mysql数据库实例详解

    python3对接mysql数据库实例详解

    这篇文章主要介绍了python3对接mysql数据库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论