获取堆栈跟踪

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.2,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

获取堆栈跟踪

报告错误对于代码中的异常或错误行为,提供一个或多个堆栈跟踪是至关重要的。要理解其中的原因,首先必须了解堆栈跟踪是什么,以及它对开发人员和库维护者的用处。

分析堆栈跟踪

之所以这样调用堆栈跟踪,是因为它允许查看从程序开始到代码中某一点的函数调用轨迹。这一点并不一定是例外。例如,您可以使用原生PHP函数debug_print_backtrace ()才能得到这样的痕迹。对于跟踪中的每一行,您将获得一个文件和一个函数或方法调用,以及该调用的行号。这通常有助于理解程序的流程,以及它如何在意想不到的地方结束,例如抛出异常的代码行。

堆栈跟踪和异常

在PHP中,每个异常都有自己的堆栈跟踪,如果未捕获异常,则默认显示该堆栈跟踪。在使用Symfony时ob娱乐下载,此类异常将经过一个自定义异常处理程序,该处理程序在根据当前Server API (CLI与否)显示它们之前以各种方式增强它们。这意味着当你不需要程序继续运行时,获得堆栈跟踪的更好方法是抛出异常,如下所示:throw new \Exception();

嵌套的异常

当应用程序变得更大时,复杂性通常需要使用需要保持分离的体系结构层来解决。例如,如果您有一个web应用程序调用远程API,那么在调用时使用在您的域中具有特殊意义的异常来包装抛出的异常,并从这些异常构建适当的HTTP异常可能会很好。异常可以通过使用之前的美元属性的签名中出现的参数异常类:public __construct ([string $message = "" [, int $code = 0 [, Throwable $previous = NULL]])这意味着有时,当您从应用程序获得异常时,实际上可能会得到几个异常。

在堆栈跟踪中寻找什么

使用库时,将调用不是自己编写的代码。当使用框架时,情况正好相反:因为你遵循框架的约定,框架找到您的代码并调用它,并提前为你做一些事情,比如路由或访问控制。ob娱乐下载Symfony既是一个框架,也是一个组件库,它调用您的代码,然后您的代码也可以调用它。这意味着在使用Symfony时,您的堆栈跟踪中将始终至少有2个部分,通常是3个部分:一个部分开始于框架的一个入口点(ob娱乐下载bin /控制台公共/ index . php在大多数情况下),并在到达代码时结束,大多数情况下是在命令中或在下面找到的控制器中src.然后,异常要么在您的代码中抛出,要么在您调用的库中抛出。如果是后者,堆栈跟踪中应该有第三个部分,在下面的文件中进行调用供应商.在进入该目录之前,代码要经过许多审查流程和CI管道,这意味着它应该比应用程序中的代码更不可能是问题的来源,因此首先关注以src,并寻找任何可疑或意外的事情,比如不应该发生的方法调用。

接下来,您可以看看涉及哪些包。下的文件供应商由Composer以以下方式组织:供应商/ acme /路由器在哪里acme是供应商,路由器图书馆和acme /路由器Composer包。如果您计划报告错误,请确保将其报告给抛出异常的库。Composer home acme/路由器应该能帮你找到正确的地方。因为Sob娱乐下载ymfony是一个单存储库,所以使用作曲家home symfonob娱乐下载y/交响乐当报告任何组件的错误时。

使用Symfony获取堆栈跟踪ob娱乐下载

现在我们已经了解了所有这些,让我们看看如何使用Symfony获得堆栈跟踪。ob娱乐下载

Web浏览器中的堆栈跟踪

在通过web浏览器从开发环境中选择堆栈跟踪时,需要注意以下几点:

  1. 有几个例外吗?如果是,最有趣的通常是异常1/n,如所示最后的在下面的例子中(它被标记为exception[1/2])。
  2. 在“Stack Traces”选项卡下,你可以找到纯文本的异常,这样你就可以很容易地在bug报告中共享它们。一定要删除任何敏感信息在这样做之前。
  3. 你可能会注意到还有一个日志标签;这个选项卡与堆栈跟踪无关,它只包含在应用程序中任意位置产生的日志。它们可能与您正在获取的异常有关,也可能与之无关,但不是术语“堆栈跟踪”所指的内容。

由于堆栈跟踪可能包含敏感数据,因此不应该在生产中公开它们。从您的生产环境中获得堆栈跟踪,虽然涉及更多,但仍然可以使用包括但不限于将它们发送到带有monolog的电子邮件地址的解决方案。

CLI中的堆栈跟踪

运行Symfony命令时可能会出现异常。ob娱乐下载默认情况下,只显示消息,因为它通常足以理解正在发生什么:

12 3 4 5 6 7 8 9 10 11 12 13 14
php bin/console debug:exception命令“调试:异常”没有定义。你是说这个吗?调试:自动装配调试:配置调试:容器调试:事件分派器调试:表单调试:路由器调试:转换调试:树枝

如果不是这种情况,您可以通过增加冗长的水平——详细

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
在Application.php第644行:[Symfony\Component\ console \ exception \CommandNoob娱乐下载tFoundException]命令“调试:异常”没有定义。你是说这个吗?调试:自动装配调试:配置调试:容器调试:事件调度器调试:表单调试:路由器调试:转换调试:树枝异常跟踪:在/ app /供应商/ syob娱乐下载mfony /控制台/ Application.php: 644 symfony \组件\ \控制台应用程序- >找到()/ app /供应商/ symfony / framework-bundle /控制台/ Application.php: 116 symfony \ \包\ FrameworkBundle \控制台应用程序- >找到()/ app /供应商/ symfony /控制台/ Application.php: 228 symfony \组件\ \控制台应用程序- > doRun()在/ app /供应商/ symfony / framework-bundle /控制台/ Application.php: 82 symfony \ \包\ FrameworkBundle \控制台应用程序- > doRun()在/ app /供应商/ symfony /控制台/ Application.php: 140ob娱乐下载Symfony\Component\Console\Application->run() at /app/bin/ Console:42

堆栈跟踪和API调用

当从API获取异常时,您可能得不到堆栈跟踪,或者它可能以不适合共享的方式显示。幸运的是,在开发环境中,您可以通过使用分析器获得纯文本堆栈跟踪。要查找配置文件,您可以查看X-Debug-Token-Link响应标头:

1 2 3 4 5 6
curl——head http://localhost:8000/api/posts/1…更多的头部X-Debug-Token: 110e1e X-Debug-Token- link: http://localhost:8000/_profiler/110e1e X-Robots-Tag: noindex X-Previous-Debug-Token: 209101

按照该链接将引导您到一个非常类似于上面描述的页面Web浏览器中的堆栈跟踪

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。