学习一些技巧来帮助您减少代码错误检查时间。在周五下午三点(为什么是这个时间?因为事情总是发生在周五下午三点),您收到一条通知,告知客户发现了您的软件中的错误。在您初步怀疑之后,您联系了Ops,检查您的软件日志以查看发生了什么,因为您记得收到通知日志已移动。结果日志被移动到你无法获取的地方,但它们被导入到网络应用程序中-所以你可以使用这个漂亮的应用程序在时间到了时检索日志,但是,应用程序还没有完成然而。该申请预计将在几天内完成。我知道,你认为那是完全不现实的。但是不,日志或日志消息似乎经常在错误的时间消失。在我们开始排除故障之前,请提一句忠告:经常检查您的日志以确保它们在您认为它们应该在的位置,并记录您认为它们应该在的位置。当您不注意时,这些事情通常会发生惊人的转变。好的,所以你找到了日志或尝试调用ops,客户确实发现了一个错误。您甚至可能认为您已经知道错误出在哪里。您立即打开您认为可能有误的文件并开始进行故障排除。1.先不要动你的代码。阅读代码。您甚至可以考虑阅读哪些部分。但在开始修改代码之前,请重现导致错误的调用并将其变成测试。这将是一个集成测试,因为您可能还有其他问题,而目前您还不知道问题出在哪里。确保此测试失败。这很重要,因为有时您的测试不会重现失败的调用,尤其是当您使用可以混淆测试的Web或其他框架时。许多东西可能存储在变量中,但不幸的是,仅仅通过查看测试并不总是很明显你在测试中调用了什么。当我试图重现这个失败的调用时,我并不是说我创建了一个可以通过的测试,但是,好吧,我做到了,但我认为这不是特别不寻常。从自己的错误中吸取教训。2.编写糟糕的测试既然你有一个失败的测试,或者可能是一个有错误的测试,是时候解决问题了。但在开始之前,让我们先检查一下调用堆栈,因为这样可以更轻松地进行故障排除。调用堆栈包括您已开始但尚未完成的所有任务。因此,如果您正在烤蛋糕并向面糊中添加面粉,您的调用堆栈将是:makecakebatteraddflour您已经开始制作蛋糕,开始制作面糊,现在您正在添加面粉.给锅底涂上油脂不在清单之列,因为您已经完成了,而制作糖霜则不在清单之列,因为您还没有开始。如果你对调用栈不是很清楚,我强烈推荐你使用PythonTutor,它可以帮助你在执行代码的同时观察调用栈。现在,如果你的Python程序有错误,Python解释器会为你打印出当前的调用栈。这意味着无论那一刻程序在做什么,很明显错误发生在调用栈的底部。3.始终首先检查调用堆栈的底部。在堆栈底部,您不仅可以看到发生了哪个错误,而且通常可以在调用堆栈的最后一行找到问题。如果堆栈底部对您没有帮助并且您的代码尚未经过代码分析,则使用代码分析非常有用。我推荐pylint或者flake8。通常情况下,它会指出一些我一直忽略的错误。如果错误看起来令人困惑,下一步可能是谷歌搜索。如果您的搜索不包含与您的代码相关的信息,例如变量名称、文件等,您将获得更好的搜索结果。如果您使用的是Python3(并且您应该使用),那么在您的搜索中包含Python3会很有帮助,否则Python2解决方案往往占主导地位。很久以前,开发人员需要在没有搜索引擎帮助的情况下解决问题。那是一段黑暗的时光。充分利用您可以使用的所有工具。不幸的是,有时问题发生在较早阶段,但仅在调用堆栈底部执行时才会显现出来。就像忘记加泡打粉一样,只有在蛋糕不发起来时才会发现。然后是检查整个调用堆栈的时候了。与Python标准库或第三方包相比,您的代码更有可能出现问题,因此请先在调用堆栈中检查您的代码。此外,在代码中放置断点通常可以更轻松地检查代码。在调用堆栈的代码中放置断点,看看是否如您所愿。“但是,玛丽,”我听到你说,“如果我有一个调用堆栈,那会有所帮助,但我只有一个失败的测试。我从哪里开始?”pdb,一个Python调试器。在您的代码中找到将被此调用攻击的位置。你应该能够找到至少一个这样的地方。在那里放置一个pdb断点。顺便说一句,为什么不使用print语句呢?我曾经依赖打印报表。有时,它们仍然很方便。但是当我开始处理复杂的代码库时,尤其是那些带有网络调用的代码库时,打印语句变得太慢了。我最终在不同的地方添加了print语句,但我无法追踪到位置和原因,而且它变得更加复杂。但是主要使用pdb还有一个更重要的原因。假设你添加了一个打印语句来查找错误问题,并且打印语句必须在错误发生之前。但是,查看放置print语句的函数,您不知道您的代码是如何执行到这一点的。查看代码是查找调用路径的好方法,但查看您以前编写的代码却很可怕。是的,我会grep通过我的代码库寻找调用函数的地方,但这变得乏味并且在搜索通用函数时不会缩小搜索范围。pdb变得非常有用。你听从我的建议,打pdb断点并运行你的测试。然而,测试再次失败,但没有遇到任何断点。保存断点,并在测试套件中运行与失败测试非常相似的测试。如果你有一个像样的测试套件,你应该能够找到其中之一。它会杀死您认为失败的测试应该杀死的代码。运行测试,然后当它遇到断点时,按w并检查调用堆栈。如果您不知道如何查看与其他调用混在一起的调用堆栈,请在调用堆栈的中间找到您的代码,然后在堆栈中该代码上方的行中放置一个断点。使用新测试重试。如果您仍然没有遇到断点,那么继续跟踪调用堆栈并找出您的调用在哪里偏离了轨道。如果您一直在没有***断点的情况下到达跟踪的顶部,那么恭喜您,您发现了问题所在:您拼错了应用程序的名称。没经验,小白,一点经验都没有。4.修改代码如果您仍然感到困惑,请在稍微更改的地方尝试新的测试。你能让新测试运行吗?有什么不同吗?什么是相同的?尝试改变其他东西。当您进行测试,可能还有其他测试时,是时候安全地修改代码以查看是否可以缩小问题范围。请记住从新提交开始解决问题,以便可以轻松撤消无效更改。(这就是版本控制,如果你没有使用过版本控制,它将改变你的生活。好吧,也许它只是让编码更容易。查看“版本控制可视化指南”以了解更多信息。)5.休息一下尽管如此,当它不再像一个有趣的挑战或游戏并开始感到沮丧时,你最好的办法就是摆脱这个问题。休息一下。我强烈建议你去散散步??,然后试着想点别的事情。6.把一切都写下来当你回来的时候,如果你没有突然受到启发,就把你知道的关于这个问题的每一点信息都写下来。这应该包括:导致问题的调用到底发生了什么,包括任何错误消息或相关日志消息您真正期望发生什么,到目前为止您为找到问题所做的工作,以及您在解决问题时发现了什么任何线索.有时这里有很多信息,但请相信我,挖掘点点滴滴很烦人。所以尽量简洁,但要完整。7.寻求帮助我经常发现写下所有的信息可以激发我去思考我还没有尝试过的事情。当然,有时我在单击帮助电子邮件(或表单)上的提交按钮后才意识到问题出在哪里。不管怎样,当你写下所有内容后一无所获时,试着给别人发邮件寻求帮助。首先是您的同事或其他参与项目的人,然后是项目的邮件列表。不要害怕向人们寻求帮助。大多数人都很友好且乐于助人,我发现在Python社区中尤其如此。
