Ist es eine gute Übung, eine hardcoded Zeichenfolge in einen Ausnahmekonstruktor zu übergeben?
Ja und Nein.
Nein in dem Sinne, dass dieser Code:
throw new Exception("Houston we have a problem");
viel schwieriger für den Anrufer ist, zu beschäftigen. Das liegt daran, dass die Ausnahme nur durch den Text der Nachricht identifiziert wird; Daher muss ein Aufrufer, der Ausnahmen von Ihrem Code abfangen möchte (z. B. um nicht abzustürzen, aber wenn möglich weiterzufahren), Zeichenfolgenvergleiche durchführen, um herauszufinden, wo das Problem liegt.
z.B.
try
{
someService.DoSomething(sessionId)
}
catch(Exception ex)
{
if (ex.Message.Contains("Houston"))
{
//this indicates that someService couldn't connect to the database
}
else if(ex.Message.Contains("is on fire"))
{
//someService detected that the network is exploded
}
else{
//we can only handle the two previous cases, all else is passed on}
throw;
}
Wie Sie sehen, dies wird chaotisch schnell, und wenn jemand ändert den Text ....
Jetzt diesen Code, auf der anderen Seite:
throw new SomethingSpecificWentWrongException(sessionId);
wo SomethingSpecificWentWrongException
könnte wie folgt aussehen:
public class SomethingSpecificWentWrongException: Exception
{
public int SessionId {get;protected set;}
public SomethingSpecificWentWrongException(int sessionId):
base($"Something specific went horribly wrong with session {sessionId}")
{
SessionId=sessionId;
}
}
kann leicht vom Anrufer behandelt werden:
try
{
someService.DoSomething(sessionId)
}
catch(SomethingSpecificWentWrongException ex)
{
//do whatever it is you do to recover from this
}
catch(SomethingElseSpecificWentWrongException wex)
{
//recover from this
}
else
{
throw;
}
Sie werden feststellen, dass es ein hartcodierte-ish Zeichenfolge hier aber es ist durch die benutzerdefinierte Ausnahmeklasse selbst, nicht durch den Code im Besitz, den die Ausnahme zu werfen entscheidet; Dies macht einen großen Unterschied, weil Sie damit garantieren können, dass die Nachricht unabhängig davon, wo diese Ausnahme verwendet wird, vorhersehbar ist (hinsichtlich der Protokollierung usw.). Es ist also nicht nur einfacher, darüber nachzudenken, es ist viel wartbarer als hartkodierende Zeichenfolgen, die der Wurfcode liefert.
Wenn diese Ausnahmemeldungen dem Client angezeigt werden, ist die Ocalierung ein Problem. Verwenden Sie jedoch benutzerdefinierte Ausnahmen, die von 'System.Exception' abgeleitet sind. Diese Typen sind aussagekräftiger und können separat behandelt werden. Sie könnten die Nachricht auch dort erstellen, anstatt wo Sie sie werfen. –