0

Ich habe versucht, einige benutzerdefinierte Ausnahmen in Laravel 5.3 ohne Glück zu implementieren.Laravel Custom Exceptions Konfiguration

Ich habe eine AppException erstellt, die die Exception-Klasse erweitert. Die Idee davon ist, dass ich einen Benutzer an meine Ausnahmen anhängen möchte, damit ich weiß, wer ihn ausgelöst hat und es protokollieren kann.

Also habe ich meine benutzerdefinierte Ausnahme wie auf den Punkt:

class AppException extends Exception{ 

    protected $userId; 

    public function __construct($message = '', $userId=0) 
    { 
     parent::__construct($message); 
     $this->userId = $userId; 
    } 
} 

Nun, was ich möchte, ist zu versuchen fangen in meinem Controller-Funktionen zu verwenden und dann eine Ausnahme fangen und dann rethrow die App Ausnahme, so kann ich anhängen der Benutzer. Wie folgt aus:

try{ 
    << code here >> 
} 
catch(Exception $e){ 
    throw new AppException($e->getMessage, $request->user()->id); 
} 

Was ich finde, ist, dass ich nicht in der Lage bin einen gute Spur Stapel zu erhalten, weil die Linie, die ich von meiner Ausnahme bin Anmeldung die Linie von der rethrow in dem Haken ist, nicht von der tatsächlichen Ausnahme.

Was wäre der richtige Weg, dies einzurichten? Ich versuche dies auf eine Art und Weise zu machen, wo ich die eingebaute Handler.php-Datei verwenden kann, die mit Laravel kommt, anstatt bei jedem try catch Log-Code eingeben zu müssen.

Danke!

Antwort

0

Die Exception Klasse hat eine previous Argument, dass Sie alle können die vorherige Ausnahme abzurufen.

class AppException extends Exception 
{ 
    private $userId; 

    public function __construct($userId, $message = '', $code = 0, Exception $previous = null) 
    { 
     $this->userId = $userId; 

     parent::__construct($message, $code, $previous); 
    } 

    public static function fromUserId($userId, Exception $previous = null) 
    { 
     return new static($userId, sprintf('Exception thrown from `%s` userid', $userId), 0, $previous); 
    } 

    public function getUserId() 
    { 
     return $this->userId; 
    } 
} 

oder einfach

class AppException extends Exception 
{ 
    public static function fromUserId($userId, Exception $previous = null) 
    { 
     return new static(sprintf('Exception thrown from `%s` userid', $userId), 0, $previous); 
    } 
} 

Nachdem Sie AppException fangen können Sie alle die Ausnahme wie folgt durchlaufen:

do { 
    printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class($e)); 
} while($e = $e->getPrevious()); 

Beispiel:

try { 
    try{ 
     throw new RuntimeException('Something bad happened.'); 
    } 
    catch(Exception $e){ 
     throw AppException::fromUserId(123, $e); 
    } 
} catch(AppException $e) { 
    do { 
     printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class($e)); 
    } while($e = $e->getPrevious()); 
} 
0

Versuchen Sie, die tatsächliche Ausnahme von der ausgelösten Exception Befestigung, zum Beispiel wie folgt aus:

class AppException extends \Exception 
{ 
    /** 
    * @var int 
    */ 
    private $userId; 

    /** 
    * @param \Exception $exception 
    * @param int  $userId 
    * 
    * @return self 
    */ 
    public static function fromExceptionAndUserId(\Exception $exception, $userId) 
    { 
     $instance = new self(
      $exception->getMessage(), 
      0, 
      $exception 
     ); 

     $instance->userId = $userId; 

     return $instance; 
    } 

    /** 
    * @return null|int 
    */ 
    public function userId() 
    { 
     return $this->userId; 
    } 
} 

Dann in Ihrem Controller:

try { 
    // ... 
} catch (\Exception $exception) { 
    throw AppException::fromExceptionAndUserId(
     $exception, 
     $request->user()->id 
    ); 
} 

Die Idee, die tatsächliche Ausnahmemeldung nicht nur zu verwenden ist, aber auch die eigentliche Ausnahme als $previous Ausnahme anzuhängen.

Die Verwendung eines benannten Konstruktors bietet Ihnen den Vorteil, dass Sie steuern können, wie die Ausnahmebedingungsnachricht AppException erstellt wird (und auch die Benutzer-ID anfügt), und weiterhin den ursprünglichen AppException-Konstruktor verwenden können. Es gibt Ihnen die Freiheit, weitere benannte Konstruktoren für verschiedene Anwendungsfälle hinzuzufügen.

Als Referenz siehe