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