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

在b站看了详细的视频教程,做一个系统的总结。第一次写关于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 除数为零

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年11月27日
下一篇 2023年11月27日

相关推荐