Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 处理/记录在整个应用程序中捕获的异常_Php_Laravel_Exception - Fatal编程技术网

Php 处理/记录在整个应用程序中捕获的异常

Php 处理/记录在整个应用程序中捕获的异常,php,laravel,exception,Php,Laravel,Exception,我目前正在维护一个具有大量代码库的应用程序。该应用程序仍在开发中 我的目标是记录应用程序中抛出的所有异常。还有那些在try-catch块中捕获的。由于庞大的代码库,我无法在catch块中添加单行代码或创建自定义异常类 我试图解决它或寻找解决方案的方式是: 倾听整个应用程序中的类构造 重写异常类(无法执行此操作,因为它是一个核心php类) 我最近尝试的代码是: 我的测试异常(dashboardcontroller.php) Exceptions\Handler.php try {

我目前正在维护一个具有大量代码库的应用程序。该应用程序仍在开发中

我的目标是记录应用程序中抛出的所有异常。还有那些在try-catch块中捕获的。由于庞大的代码库,我无法在catch块中添加单行代码或创建自定义异常类

我试图解决它或寻找解决方案的方式是:

  • 倾听整个应用程序中的类构造
  • 重写异常类(无法执行此操作,因为它是一个核心php类)
我最近尝试的代码是: 我的测试异常(
dashboardcontroller.php

Exceptions\Handler.php

try {
        throw new \Exception('custom thrown exception');
    } catch (\Exception $e) {
        Log::info('Exception caught');
    }
public function report(Exception $exception)
    {
        Log::info($exception);
        parent::report($exception);
    }
Log

[2020-03-10 17:19:09] local.INFO: Exception caught
所以问题是:我如何记录/处理在try-catch块中捕获的抛出异常,而不添加需要大量更改的代码?

简短回答:你不能(据我所知)

被捕获的异常通常是由于某种原因被捕获的;它们在catch语句(即异常处理程序)中被处理(或:它们应该被处理)。您要记录的是未捕获的异常

异常永远不应用于程序流,但它无论如何都会发生,有时是出于好的理由:

if (fileExists('foo.txt')) {
  fileDelete('foo.txt'); // May result in a race-condition
}
附加说明:

另一种常见模式:

while (true) {
  try {
    item = queue.Receive(10); // Wait max. 10 seconds
    process(item);            // Process item
  } catch (TimeOutException) {
    // Nothing on queue, handle other stuff and then continue waiting...
    DoStuff();
  }
}
上述模式非常常见。再次强调:异常不应该用于程序流,上面的队列示例当然不应该存在,但事实是它发生了。现实世界中的应用程序、库、API等。有时就是这样工作的,当您处理第三方应用程序、库或API时,您就会遇到麻烦,因为您无法始终将所有内容更改为您希望的内容

您能想象一下,在上面的队列示例中,您的日志文件中有一个24/7运行的应用程序的“通用应用程序范围捕获记录器”吗

何时记录异常(可能同样重要:记录什么)应根据具体情况考虑

while (true) {
  try {
    item = queue.Receive(10); // Wait max. 10 seconds
    process(item);            // Process item
  } catch (TimeOutException) {
    // Nothing on queue, handle other stuff and then continue waiting...
    DoStuff();
  }
}