本文主要是介绍Python bug终结者:常见错误+异常处理+程序调试+错误代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
(一).常见错误
- 缺少冒号引起错误:在 if,else,else,while,class,def 声明末尾需要添加冒号 :,若忘记添加将会提示“SyntaxError:invalid syntax”的语法错误。
- 将赋值运算符 = 和比较运算符 == 混淆:将会提示“SyntaxError:invalid syntax”的语法错误。
- 代码结构的缩进错误:将会提示错误信息如“IndetationError:unexpected indent”、“IndentationError:unindent does not match any outer indetation level”和“IndentationError:expected an indented block”
- 修改元组和字符串的值时报错
- 连接字符串和非字符串:将会提示错误“TypeError:Can‘t convert ’int‘ object to str implicitly”。
- 在字符串首尾忘记加引号:将会提示错误“SyntaxError:EOL while scanning string literal”。
- 变量或者函数名拼写错误:将会提示错误“NameError:name ’xxx‘ is not defined”。
- 引用超过列表的最大索引:将会提示错误”IndexError:list index out of range“。
- 使用关键字作为变量名:将会提示错误”SystaxError:invalid syntax“。
- 变量没有初始值就使用增值操作符:将会提示错误“NameError:name ’xxx‘ is not defined”。
- 误用自增和自减运算符:将会提示错误”SystaxError:invalid syntax“。
- 忘记为方法的第一个参数添加self参数:将会提示错误”TypeError:myMethod() takes 0 positional arguments but 1 was given“。
(二)异常
1.异常的概念
当Python解释器遇到一个无法预期的程序行为时,它就会输出一个异常(exception)。例如遇到除以零,或是打开不存在的文件等。用户也可以使用raise语句,来抛出一个异常。当Python解释器遇到异常情况时,它会停止程序的运行,然后显示一个追踪(traceback)信息。
2.内置异常
Python的内置异常定义在 exceptions 模块中,此模块在Python解释器启动时就会自动加载
最常用的异常类的含义如下:
(1) BaseException:所有异常的基类。
(2) SystemExit:解释器请求退出。
(3) KeyboardInterrupt:用户中断执行。
(4) Exception:常规错误的基类。
(5) StopIteration:迭代器没有更多的值。
(6) GeneratorExit:生成器(generator)发生异常来通知退出。
(7) SystemExit:Python解释器请求退出。
(8) StandardError:所有的内置标准异常的基类。
(9) ArithmeticError: 所有数值计算错误的基类。
(10) FloatingPointError:浮点计算错误。
(11) OverflowError:数值运算超出最大限制。
(12) ZeroDivisionError:除(或取模)零 (所有数据类型)的错误。
(13) AssertionError:断言语句失败。
(14) AttributeError: 对象没有这个属性。
(15) EOFError:没有内置输入,常见的为文件读取错误,另外,Ctrl+D也会触发这个异常。
(16) EnvironmentError:操作系统错误的基类。
(17) IOError:输入/输出操作失败。
(18) OSError:操作系统错误。
(19) WindowsError:系统调用失败。
(20) ImportError:导入模块/对象失败。
(21) KeyboardInterrupt:用户中断执行(通常是Ctrl+C)。
(22) LookupError:无效数据查询的基类。
(23) IndexError:序列中没有此索引(index)。
(24) KeyError:映射中没有这个键。
(25) MemoryError:内存溢出错误(对于Python 解释器不是致命的)。
(26) NameError:没有声明对象或没有初始化对象。
(27) UnboundLocalError:访问未初始化的本地变量。
(28) ReferenceError:试图访问已经垃圾回收了的对象。
(29) RuntimeError:一般运行时的错误。
3.使用try…except语句处理异常
try…except语句用在处理Python所输出来的异常。
其语法为:
try:<语句>
except [<异常的名称> [, <异常类的实例变量名称>]]:<异常的处理语句>
[else:<没有异常产生时的处理语句>]
中括号 [ ] 内的语法是可以省略的
异常的名称可以是空白的,表示except语句处理所有类型的异常
异常的名称也可以是一个或多个
可以使用多个不同的except语句来处理不同的异常
else语句是没有异常发生时的处理程序
4.异常类的实例
每当有一个异常被输出时,该异常类就会创建一个实例,此实例继承了异常类的所有属性。每一个异常类实例,都有一个args属性。args属性是一个元组格式,这个元组格式可能只包含错误信息的字符串(1-tuple),也可能包含2个以上的元素(2-tuple,3-tuple,…)。
异常类的不同,这个元组格式也不同。
5.清除异常
try…finally语句可以用来当作清除异常的功能。不管try语句内是否运行失败,finally语句一定会被运行。
注意: try与except语句可以搭配使用,try与finally语句也可以搭配使用,但是except与finally语句不可以放在一起。
6.内置异常的协助模块
-
a、sys模块
使用sys模块的exc_info()函数,可以取得目前正在处理的异常信息。exc_info()函数会返回一个元组,这个元组包括三个元素(类型、值、具体信息)。 -
b、traceback对象
使用sys模块的exc_info()函数返回值的第三个元素,会返回一个traceback对象。traceback对象的接口函数可以捕捉、格式化,或是输出Python程序的堆栈追踪(stack trace)信息。
traceback.print_exc():此函数调用sys.exc_info()来输出异常的信息。
7.抛出异常
- a、raise语句:Python使用raise 语句抛出一个指定的异常。例如:
>>>raise NameError('这里使用raise抛出一个异常')Traceback (most recent call last):File "<pyshell#13>", line 1, in <module>raise NameError('这里使用raise抛出一个异常')NameError: 这里使用raise抛出一个异常
raise 唯一的一个参数指定了要被抛出的异常,必须是一个异常的实例或者是异常的类(即Exception的子类)。
提示:若只想判断是否抛出一个异常而不想去处理它,此时使用raise语句是最佳的选择。
- b、结束解释器的运行:用户可以利用输出SystemExit异常,来强迫结束Python解释器的运行。
使用sys.exit()函数会输出一个SystemExit异常,sys.exit()函数会结束线程。
若想正常结束Python解释器的运行,最好使用os模块的_exit()函数 - c、离开嵌套循环:如果想离开循环的时候,通常是使用break语句。如果在一个嵌套循环之内,break语句只能离开最内层的循环,而不能离开嵌套循环,此时可以使用raise语句离开嵌套循环。
8.用户定义异常类
除了内置异常,Python也支持用户定义的异常。用户定义的异常与内置异常并无差别,只是内置异常是定义在exceptions模块中。当Python解释器启动时,exceptions模块就会事先加载。
Python允许用户定义自己的异常类,用户定义的异常类必须是从任何一个Python的内置异常类派生 而来。
还可以将创建的用户定义异常类,再当作其他用户定义异常类的基类。
通常异常类在创建时均以”Error“结尾,与标准的异常命名一样
(三).程序调试
-
a、使用assert语句
通过使用assert语句,可以帮助用户检测程序代码中的错误。
assert语句的语法格式:
assert <测试码> [, 参数]
测试码是一段返回True或是False的程序代码。
若测试码返回true,则继续运行后面的程序代码。
若测试码返回false,assert语句会输出一个AssertionError异常。并且输出assert语句的[参数],作为错误信息字符串。 -
b、使用__debug__内置变量
Python解释器有一个内置变量__debug__,__debug__在正常情况下的值是True。
>>> __debug__
True
当用户以最佳化模式启动Python解释器时,__debug__值为False。要使用最佳化模式启动Python解释器,须设置Python命令行选项-O。
语法格式:
if __debug__:if not (<测试码>):raise AssertionError [,参数]
(四)错误代码
Python的errno模块,包含许多错误代码(errno)的系统符号(system symbol)。errno模块用在定义操作系统所返回的整数错误码,及其对应的系统符号。
当用户使用dir(errno) 指令时,可以得到所有错误代码的系统符号。
使用os模块的strerror()函数,可以将错误代码转换成该错误代码的说明字符串。例如错误代码error.E2BIG的说明字符串是’Arg list too long‘。
这篇关于Python bug终结者:常见错误+异常处理+程序调试+错误代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!