2016-03-26 6 views
0

Ich habe eine Situation, in der eine Benutzeroperation den aktuellen Status einer Anfrage ändert.Welche Ausnahme sollte ich werfen und sollte ich eine Nachricht bereitstellen?

über den aktuellen Status Je dann nur bestimmte Operationen sind möglich, dh

Pending genehmigt werden kann oder abgelehnte oder gekündigte Approved kann ‚Angeforderte Abbrechen‘ werden ‚Angeforderte Abbrechen‘ kann ‚Annullierung Approved‘ oder ‚Stornierung werden angeforderte‘

Meine Frage ist, welche Art von Ausnahme soll ich erhöhen, wenn die angeforderte Operation nicht durchgeführt werden kann? Sollte ich eine eingebaute Ausnahme verwenden oder sollte ich eine benutzerdefinierte Ausnahme wie InvalidCurrentStatusException oder ähnliches erstellen?

für InvalidOperationException bei der Dokumentation der Suche scheint einen Hauptkandidat als es die Ausnahme, die ausgelöst wird, wenn ein Methodenaufruf für das Objekt aktuellen Zustand ungültig ist "ist.

Wenn ich mit der zweiten Option einer benutzerdefinierten Ausnahme gehe dann brauche ich nicht eine Nachricht zu liefern.

Wenn ich die eingebaute InvalidOperationException verwenden soll ich biete eine Nachricht und was sollte die Botschaft sein?

UPDATE:

hier ist der Code, den ich im Moment haben:

internal void CancelRequest(int requestID, int userID, string notes) 
{ 

     DateTime editDate = DateTime.UtcNow; 

     var request = this.FindByID(requestID, CancelRequestIncludes); 

     if(request == null) 
     { 
      throw new ArgumentException(InvalidRequestMessage); 
     } 

     var currentStatus = request.LeaveRequestStatuses.Where(s => s.IsCurrent).FirstOrDefault(); 

     if (currentStatus.StatusID == (int)RequestStatuses.RequestPending) 
     { 
      SetNewRequestStatus(request, currentStatus, RequestStatuses.CancellationApproved, userID, notes, editDate); 
     } 
     else if (currentStatus.StatusID == (int)RequestStatuses.RequestApproved) 
     { 
      if (ValidApprover(request.UserID, userID)) 
      { 
       SetNewRequestStatus(request, currentStatus, RequestStatuses.CancellationPending, userID, notes, editDate); 
      } 
      else 
      { 
       //throw an invalid approver exceptioon 

      } 
     } 
     else 
     { 
      //throw exception as cant carry out cancellation 
     } 

     Context.SaveChanges(); 
} 
+0

Ich ziehe es individuelle Ausnahmen für meinen Code und System Ausnahmen für Systemklassen verwenden Dies kann Ihnen helfen. Wenn Sie nicht wissen, wo der Fehler liegt und warum. – ganchito55

+1

Wenn Sie feststellen können, dass die Anfrage ungültig ist, sollten Sie eine Ausnahme gegen eine Fehlermeldung jeglicher Art auslösen. Oder besser, deaktivieren Sie die ungültigen Optionen bedingt, damit der Benutzer nicht kippen kann tue schlechte Dinge – Plutonix

+0

Ich stimme @Plutonix zu: In diesem Fall können Sie anstelle einer Ausnahme eine Art "Anwendungsstatus" -Eigenschaft und Aufzählung (Genehmigt, Abgelehnt, Abgebrochen) verwenden. Mit freundlichen Grüßen, –

Antwort

4

Sie sollten nie eine Exception (oder eine Unterklasse) verwenden, um den Zustand der Anwendung zu steuern, oder logischen Fluss zeigen. Stattdessen sollten Sie eine Klasse erstellen, die als "Ergebnis" fungiert, in der Sie eine Eigenschaft hinzufügen, die den "Status" hat - wie einige andere bereits kommentiert haben, ist eine Aufzählung ein Paradebeispiel für einen gewünschten Anwendungsfall.

public enum RequestStatus 
{ 
    Approved, 
    Rejected, 
    Cancelled, 
    UnableToCarryOut 
} 

public class RequestResult 
{ 
    public RequestStatus Status { get; set; } 
    public string Message { get; set; } 
} 

Dann passieren einfach um eine Instanz dieses Objekts.

+0

So mache ich normalerweise Dinge, aber viele Dinge, die ich in letzter Zeit gesehen und gelesen habe, scheinen zu implizieren, dass Sie eine Ausnahme verwenden sollten. –

+1

Ich bin gespannt was du liest. Ich glaube immer noch, du solltest nicht werfen, es sei denn, es ist wirklich außergewöhnlich. –

+0

Ich lese gerade diese http://codeutopia.net/blog/2010/03/11/should-a-failed-function-return-a-value-o-- throw-an-exception/ und es scheint Ihre zu unterstützen (und meine übliche) Methode, einen Return-Code zu verwenden: Eine häufig vergessene Tatsache ist die Stabilität der Anwendung. Wenn Sie kritischen Code schreiben, der so stabil wie möglich sein sollte, was sollten Sie verwenden? Rückgabewerte. ' –

0

Benutzerdefinierte Ausnahme wäre in diesem Fall die beste Option. Und Sie haben es richtig vermutet - es sollte zwei Arten von denen geben (wie Ihre Kommentare vorschlagen). - InvalidApproverException - UnexpectedStatusException

Beide tatsächlich durch InvalidOperationException derieved oder sogar ersetzt werden, aber dann werden Sie jedes Mal ähnliche Ausnahmemeldung liefern müssen : Die Klassen für diejenigen, sollte selbsterklärend zu benennen. Das Gute an benutzerdefinierten Ausnahmen ist, dass Sie weitere Informationen zum Kontext der Ausnahme hinzufügen können. Insbesondere die InvalidApproverException - kann die ID des tatsächlichen Genehmigers offen legen, die für den Vorgang fehlgeschlagen ist. Dies könnte später nützlich sein. Auch - es kann intern die Nachricht auf eine konstante Zeichenfolge setzen: etwas Ähnliches wie: "Der Anrufer ist nicht der Initiator der Anfrage". As oder die zweite Ausnahme (UnexpectedStatusException) - ich würde auch die CurrentRequestStatus -Eigenschaft darauf und wieder eine konstante Fehlermeldung haben. Das vereinfacht das Handling auf der Straße. Hier ist ein Beispielcode für die Ausnahme:

public class UnexpectedStatusException: Ausnahme { Privat const string DefaultExceptionMessage = „Die Anforderung ist nicht in einem erwarteten Zustand.„;

public LeaveRequestStatus CurrentStatus 
{ 
    get; private set; 
} 

public UnexpectedStatusException(LeaveRequestStatus currentStatus) : this(currentStatus, DefaultExceptionMessage) 
{ 
} 

public UnexpectedStatusException(LeaveRequestStatus currentStatus, string message) : base(message) 
{ 
    this.CurrentStatus = currentStatus; 
} 

}

public enum LeaveRequestStatus { // Anfrage statueses hier }

Verwandte Themen