feat(exceptions): introduce NonReportableException to handle known errors and update Handler for selective reporting

This commit is contained in:
Andras Bacsai
2025-09-08 09:18:25 +02:00
parent 45c75ad9c1
commit a243b99df4
3 changed files with 43 additions and 7 deletions

View File

@@ -29,6 +29,7 @@ class Handler extends ExceptionHandler
*/ */
protected $dontReport = [ protected $dontReport = [
ProcessException::class, ProcessException::class,
NonReportableException::class,
]; ];
/** /**
@@ -110,9 +111,14 @@ class Handler extends ExceptionHandler
); );
} }
); );
// Check for errors that should not be reported to Sentry
if (str($e->getMessage())->contains('No space left on device')) { if (str($e->getMessage())->contains('No space left on device')) {
// Log locally but don't send to Sentry
logger()->warning('Disk space error: '.$e->getMessage());
return; return;
} }
Integration::captureUnhandledException($e); Integration::captureUnhandledException($e);
}); });
} }

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Exceptions;
use Exception;
/**
* Exception that should not be reported to Sentry or other error tracking services.
* Use this for known, expected errors that don't require external tracking.
*/
class NonReportableException extends Exception
{
/**
* Create a new non-reportable exception instance.
*
* @param string $message
* @param int $code
*/
public function __construct($message = '', $code = 0, ?\Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
}
/**
* Create from another exception, preserving its message and stack trace.
*/
public static function fromException(\Throwable $exception): static
{
return new static($exception->getMessage(), $exception->getCode(), $exception);
}
}

View File

@@ -2,6 +2,7 @@
namespace App\Notifications\Channels; namespace App\Notifications\Channels;
use App\Exceptions\NonReportableException;
use App\Models\Team; use App\Models\Team;
use Exception; use Exception;
use Illuminate\Notifications\Notification; use Illuminate\Notifications\Notification;
@@ -101,13 +102,11 @@ class EmailChannel
$mailer->send($email); $mailer->send($email);
} }
} catch (\Throwable $e) { } catch (\Throwable $e) {
\Illuminate\Support\Facades\Log::error('EmailChannel failed: '.$e->getMessage(), [ // Check if this is a Resend domain verification error on cloud instances
'notification' => get_class($notification), if (isCloud() && str_contains($e->getMessage(), 'domain is not verified')) {
'notifiable' => get_class($notifiable), // Throw as NonReportableException so it won't go to Sentry
'team_id' => data_get($notifiable, 'id'), throw NonReportableException::fromException($e);
'error' => $e->getMessage(), }
'trace' => $e->getTraceAsString(),
]);
throw $e; throw $e;
} }
} }