pycharm的debug调试以及异常,Python中错误的处理过程
作者:Make_magic
第一次写关于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
除数为零
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。