2016-09-17 6 views
0

ich meine Meinung darüber, wie steckte mit Fehlerbehandlung im folgenden Fall zu modellieren:Scala Fehlermodellierung

I CommonErrors habe, die Fehler sind, die solche für all meine Methoden

Ich habe auch bestimmte Fehler auftreten kann wie: Error1, Error2, Error3

Also haben wir am Ende

DoAErrors = CommonErrors + Error1 + Error2

DoBErrors = CommonErrors + Error2 + Error3

und die Methodensignaturen:

doA() Either[DoAErrors, DoAResult] 
doB() Either[DoBErrors, DoBResult] 

Zu schön, ich so die Kunden meiner Bibliothek versiegelten Züge nutzen möchten, können sicher Muster Match auf DoAErrors und DoBErrors und fangen Sie die allgemeinen + spezifischen Fehler auf. Bis jetzt, was ich versucht:

sealed trait CommonErrors 
… extends CommonErrors 
… extends CommonErrors 

sealed trait DoAErrors extends CommonErrors 
Error1 extends DoAErrors 

sealed trait DoBErrors extends CommonErrors 

Error2 extends DoAErrors with DoBErrors 
Error3 extends DoBErrors 

Das Problem kommt von der Tatsache, dass doA() und doB() intern eine Methode aufrufen, die eine CommonError zurückgibt und es ist nicht möglich, CommonErrors in DoA noch DoB Fehler nachzurüsten. Wie würde man diesen Fall modellieren?

Danke für die Hilfe!

Antwort

1

Von Ihrer Beschreibung klingt es wie CommonErrors ist eigentlich eine mögliche Art von beiden DoAErrors und DoBErrors. Mit anderen Worten - die folgenden Aussagen zutreffen: Das bedeutet normalerweise, dass CommonErrors sollten die anderen Typen erweitern und nicht umgekehrt

CommonErrors A DoAErrors

CommonErrors IST EIN DoBErrors

WIRD.

Und in der Tat - der folgende Code kompiliert und ermöglicht eine einfache Pattern-Matching für Aufrufstellen von doA und doB:

sealed trait DoAErrors 
sealed trait DoBErrors 
sealed trait CommonErrors extends DoAErrors with DoBErrors 

class CommonE1 extends CommonErrors 
class CommonE2 extends CommonErrors 
class Error1 extends DoAErrors 
class Error2 extends DoAErrors with DoBErrors 
class Error3 extends DoBErrors 

object Test { 

    private def common(): Either[CommonErrors, String] = Left(new CommonE1()) 
    def doA(): Either[DoAErrors, String] = common() 
    def doB(): Either[DoBErrors, String] = common() 
} 
+0

hmm eigentlich macht es Sinn, werde ich versuchen, und lassen Sie wissen. Ursprünglich hatte ich nur CommonErrors, also als ich ErrorA und B hinzufügte, versuchte ich, mit den vorhandenen Fehlern zu komponieren. Danke vielmals ! –

+0

Es scheint gut zu funktionieren! Vielen Dank ! –