写点什么

软件测试 | 程序报错不要慌

  • 2023-05-06
    北京
  • 本文字数:2053 字

    阅读完需:约 7 分钟

我们找了一本 Python 教程,按照书上的例子一行一行敲下来,结果一运行却出错了。报错对于初学编程的人来说是恐惧的。那么如何应对常见的几类错误。

缩进错误

在 Python 程序中,不需要用“{}”来表示一个语句体,也不需要用“;”来表示一个语句的结束。Python 对程序的缩进有着严格的要求,但你有时候却并不容易发现缩进问题。

如图 1.16 所示,程序看上去没有任何问题,但运行的时候却出现了“IndentationError:unindent does not match any outer indentation level”的错误。其实错误信息描述,已经很清楚了,但新手往往很难发现错误的原因。

图 1.16 Python 程序报错

如果将程序全选(快捷键 Ctrl+a),就会发现错误,如图 1.17 所示。在 add()函数的语句体中,“c=a+b”前面是一个 Tab 的间距,而“return c”前面是四个空格的间距。所以,虽然看上去缩进是对齐的,但它们却使用了不同的缩进方法,因而会导致 Python 执行错误。

图 1.17 Sublime Test 中的全选

引包错误

引包错误也是新手经常遇到的一类问题,但这其中有一个大坑。

import unittest
class test (unittest.TestCase): pass
复制代码

运行程序。

Traceback (most recent call last): File "D:\pydemo\unittest.py",line 1,in <module>   import unittest File "C:\pydemo\unittest.py",line 3,in <module>   class test(unittest.TestCase):AttributeError:model 'unittest' has no attribute 'TestCase'
复制代码

我们要引用的明明是 Python 自带的 unittest 模块,然而程序却提示“module ‘unittest’has no attribute TestCase”。这个错误与 Python 的引包机制有关,当在程序中“import”一个模块或库时,Python 首先会查找当前目录下是否存在同目录的 Python 文件,如果存在则会优先引用当前目录下的同名文件。

显然,我把自己写的程序文件命名为了“unittest.py”,在程序中又引用“unittest”,那么这就相当于自引用了。而我的真实意图是引用 Python 的 unittest 模块。当然,有时也不一定是自引用,也可能是程序的所在目录下出现了重名文件或目录。所以,在给编写的程序文件命名时一定要注意。

编码错误

在开发 Python 程序的过程中,会涉及三个方面的编码,具体如下。

(1)Python 程序文件编码

编写的程序本身也存在编码,一般可以在程序的开头加上“#coding=utf-8”或“#coding=gbk”,使程序统一为 UTF-8 或 GBK 编码。

(2)Python 程序运行环境(IDE)编码

不管是 Python 自带的 IDLE 或是 PyCharm,使用的 IDE 本身也会有编码。所以要清楚地知道自己的 IDE 所使用的编码。

(3)Python 程序读取外部文件、网页的编码。

最容易出现编码问题的情况应该是 Python 读取外部文件、网页的时候。首先要确定读取的文件、网页的编码格式,然后通过 decode()和 encode()方法来进行编码转换。

decode 的作用是将其他编码的字符串转换成 Unicode 编码。

encode 的作用是将 Unicode 编码转换成其他编码的字符串。

当我们再遇到 Python 的编码问题时,从以上三个方面分析就可以很容易地解决了。

学会分析错误

新手往往在看到程序抛出的一大堆报错时会变得手足无措,比起一大堆的报错,最难解决的问题是没有任何报错信息,而程序却无法正确地执行。如果能正确认真阅读报错信息,一般会很容易找到出现错误的原因。

......Traceback (most recent call last)  File "C:\Python35\lib\site-packages\diango\core\handlers\exception.py",line 39, in inner    response = get_response(request)  File "C:\Python35\lib\site-packages\django\core\handlers\base.py",line 249,in _legacy_get_responce   responce = self._get_response(request)  File "C:\Python35\lib\site-packages\django\core\handlers\base.py",line 187,in _get_responce    responce = self.process_exception_by_middeware(e,request)  File "C:\Python35\lib\site-packages\django\core\handlers\base.py",line 185,in _get_responce  responce = wrapped_callback(request, *callback_args, **callback_kwargs)  File "C:\Python35\lib\site-packages\django\contrib\auth\decorators.py",line 23, in _wrapped_view  return view_func(request, *args, **kwargs)  File "D:\git\guest\sign\views.py",line 85,in search_phone    print(phone)NameError:name 'phone' is not defind
复制代码

上面是 Django 的一段报错信息。在分析报错信息时,一般要遵循以下两点。

(1)找到自己写的程序。所以前面的一大段信息就没必要看了;根据倒数第三行的提示:“File ”D:\git\guest\sign\views.py", line 85,in search_phone"(views.py 文件的倒数第 85 行,在 search_phone 函数中,找到自己写的代码“print(phone)”)。

(2)看最终的错误提示。最终的提示为“NameError: name 'phone' is not defind”。"NameError"为错误类型,根据错误类型可以锁定错误范围。“name ‘phone’is not defined”为错误提示(名字‘phone’没有定义)。结合第一点找到自己写的程序,显然,print()打印的‘phone’变量没有定义。

搜索微信公众号:TestingStudio 霍格沃兹的干货都很硬核

用户头像

社区:ceshiren.com 微信:ceshiren2023 2022-08-29 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料、实事更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬

评论

发布
暂无评论
软件测试 | 程序报错不要慌_测试_测吧(北京)科技有限公司_InfoQ写作社区