Best Practices bei der Ausnahmebehandlung

Wenn eine Ausnahme nicht in die exception.log -Datei mit dem Ausnahmemodell als Kontext, wird sie in New Relic oder anderen monolog-kompatiblen PSR-3-Protokollspeichern nicht korrekt erkannt und analysiert. Die Protokollierung nur eines Teils der Ausnahme (oder die Protokollierung in die falsche Datei) führt zu Produktionsfehlern, wenn Ausnahmen übersehen werden.

Korrekte Ausnahmebehandlung

Die folgende Checkliste enthält Beispiele für die korrekte Handhabung von Ausnahmen.

korrekt In das Ausnahmeprotokoll schreiben

Schreiben Sie mit dem folgenden Muster in das Ausnahmeprotokoll, unabhängig von weiteren Aktionen, es sei denn, es gibt einen zwingenden Grund, dies nicht zu tun.

try {
    $this->productRepository->getById($sku);
} catch (Exception $e) {
    $this->logger->critical($e);
}

Dieser Ansatz speichert automatisch die $e->getMessage zur Protokollmeldung und $e -Objekt zum Kontext hinzu, folgen Sie dem PSR-3-Kontextstandard. Dies geschieht in \Magento\Framework\Logger\Monolog::addRecord.

korrekt Schallzeichen

Stummschaltsignale, indem keine Ausnahmen protokolliert werden, die Teil des beabsichtigten Betriebsablaufs sind. Wenn die Ausnahme auftritt, ist keine Folgeaktion erforderlich, sodass sie nicht protokolliert und analysiert werden muss, wenn sie auftritt. Fügen Sie einen Kommentar hinzu, der angibt, warum Signale stummgeschaltet werden und ob dies beabsichtigt ist. Kombinieren mit phpcs:ignore.

try {
    $this->productRepository->deleteById($sku);
} catch (NoSuchEntityException $e) { // phpcs:ignore Magento2.CodeAnalysis.EmptyBlock.DetectedCatch
    // Product already removed
}

korrekt Herabstufungsausnahmen

Herabstufen von Ausnahmen durch Befolgen der PSR-3-Kontextstandard.

try {
    $this->productRepository->getById($sku);
} catch (Exception $e) {
    $this->logger->debug($e->getMessage(), ['exception' => $e]);
}

korrekt Die Protokollierung kommt immer zuerst

Als Best Practice wird die Protokollierung immer zuerst im Code durchgeführt, um Fälle zu verhindern, in denen eine andere Ausnahme oder ein schwerwiegender Fehler ausgelöst wird, bevor in das Protokoll geschrieben wird.

try {
    $this->productRepository->getById($sku);
} catch (Exception $e) {
    $this->logger->critical($e);
    $this->alternativeProcedure();
}

korrekt Protokollmeldungen und der gesamte Ausnahmeverlauf

Loggen Sie Meldungen und den gesamten Ausnahmeverlauf ein, indem Sie PSR-3-Kontextstandard.

try {
    $this->productRepository->getById($sku);
} catch (Exception $e) {
    $this->logger->critical($e->getMessage(), ['exception' => $e, 'trace' => $e->getTrace()]);
}

Falsche Ausnahmebehandlung

Die folgenden Beispiele zeigen eine falsche Ausnahmebehandlung.

falsch Logik vor der Protokollierung

Die Logik vor der Protokollierung kann zu einer weiteren Ausnahme oder einem schwerwiegenden Fehler führen, der verhindert, dass die Ausnahme protokolliert wird, und durch ersetzt werden sollte. korrekt example.

try {
    $this->productRepository->deleteById($sku);
} catch (NoSuchEntityException $e) {
    $this->alternativeProcedure();
    $this->logger->critical($e);
}

falsch Empty catch

Empty catch -Blöcke können ein Zeichen für eine unbeabsichtigte Mutation sein und sollten durch die korrekt example.

try {
    $this->productRepository->deleteById($sku);
} catch (NoSuchEntityException $e) {
}

falsch Doppelte Lokalisierung

Wenn die erfasste lokalisierte Ausnahme noch nicht übersetzt ist, beheben Sie das Problem an der Stelle, an der die Ausnahme zum ersten Mal ausgelöst wird.

try {
    $this->productRepository->getById($sku);
} catch (LocalizedException $e) {
    throw new LocalizedException(__($e->getMessage()));
}

falsch Meldungen protokollieren und Verfolgen zu verschiedenen Protokolldateien

Der folgende Code protokolliert fälschlicherweise den Stacktrace für eine Ausnahme als Zeichenfolge in einer Protokolldatei.

try {
    $this->productRepository->getById($sku);
} catch (\Exception $e) {
    $this->logger->error($e->getMessage());
    $this->logger->debug($e->getTraceAsString());
}

Durch diesen Ansatz werden Zeilenumbrüche in der Nachricht eingeführt, die nicht mit PSR-3 konform sind. Die Ausnahme, einschließlich Stacktrace, muss Teil des Nachrichtenkontexts sein, um sicherzustellen, dass sie mit der Nachricht in New Relic oder einem anderen monolog-kompatiblen PSR-3-Protokollspeicher korrekt gespeichert wird.

Beheben Sie dieses Problem, indem Sie den Code ersetzen, der den korrekten Beispielen folgt, die unter In das Ausnahmeprotokoll schreiben oder Herabstufungsausnahmen.

falsch Herabstufen von Ausnahmen ohne Kontext

Die Ausnahme wird auf einen Fehler herabgestuft, bei dem kein Objekt, sondern nur eine Zeichenfolge übergeben werden darf. Daher wird die getMessage(). Dadurch geht die Spur verloren und sollte durch die korrekten Beispiele ersetzt werden, die in In das Ausnahmeprotokoll schreiben oder Herabstufungsausnahmen.

try {
    $this->productRepository->getById($sku);
} catch (\Exception $e) {
    $this->logger->error($e->getMessage());
}

falsch Melden Sie nur die Meldung im Ausnahmeprotokoll an.

Anstelle der Übergabe des Objekts $e, nur $e->getMessage() übergeben wird. Dadurch geht die Spur verloren und sollte durch die richtigen Beispiele ersetzt werden In das Ausnahmeprotokoll schreiben oder Herabstufungsausnahmen.

try {
    $this->productRepository->getById($sku);
} catch (\Exception $e) {
    $this->logger->critical($e->getMessage());
}

falsch Fehlt // phpcs:ignore Magento2.CodeAnalysis.EmptyBlock.DetectedCatch

Auslassen der phpcs:ignore las Trigger eine Warnung in PHPCS und sollte Ihr CI nicht übergeben. Dies sollte durch das richtige Beispiel ersetzt werden, das in Schallzeichen.

try {
    $this->productRepository->deleteById($sku);
} catch (NoSuchEntityException $e) {
    // Product already removed
}
recommendation-more-help
754cbbf3-3a3c-4af3-b6ce-9d34390f3a60