Forum: PC-Programmierung C#: ErrorCode-> String Ausgabe


von Chris (Gast)


Lesenswert?

Hallo zusammen,

bei den Methoden meiner C# Applikation kann ich mehrere ErrorCodes als 
Rückgabewert bekommen.

In einem Textfeld schreibe ich immer ob die User-Anfragen erfolgreich 
durchgeführt sind oder nicht, im Fehlerfall möchte ich aber kein 
ErrorCode ausgeben, sondern ein dazugehöriges Text.

Wie kann ich das am einfachsten handeln? (in einer Art Matrix wo ich mit 
dem ErrorCode ein String bekommen kann!)

von Christian R. (mrrotzi)


Lesenswert?

Mach dir eine Hashtable mit Nummer und Text Paaren.
So kannst du für jede Nummer einen Text hinterlegen.
1
  public static class MyErrors
2
  {
3
    public const int ERROR_FAIL_1 = 0x8001;
4
    public const int ERROR_FAIL_2 = 0x8002;
5
    public const int ERROR_FAIL_3 = 0x8003;
6
7
    private const string UnknownErrorNumber = "Unknown.";
8
9
    private static Dictionary<int, string> errorMap = new Dictionary<int, string>
10
    {
11
      { ERROR_FAIL_1, "Fehlertext Beschreibung für Fehler 01" },
12
      { ERROR_FAIL_2, "Fehlertext Beschreibung für Fehler 02" },
13
      { ERROR_FAIL_3, "Fehlertext Beschreibung für Fehler 03" }
14
    };
15
16
    public static string GetErrorText(int number)
17
    {
18
      if (errorMap.ContainsKey(number))
19
        return errorMap[number];
20
      return UnknownErrorNumber;
21
    }
22
  }

Es gibt sicher jede Menge anderer Ansätze sowas zu lösen. Mit diesem hat 
man wenigstens alles (Fehlernummern, Fehlertexte) an einer Stelle.

Du kannst dann auf die Konstanten zugreifen:
1
var errNr = MyErrors.ERROR_FAIL_1;

um den Wert irgendwo zurück zu geben. Und an einer anderen Stelle 
(Textbox) die Nummer in einen String umwandeln lassen:
1
textBox.Text = MyErrors.GetErrorText(errNr);

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Fehlercodes besser als Enum definieren und dann per eine "zu Fehlertext" 
Funktion mit einem switch oder Dictonary.
http://msdn.microsoft.com/de-de/library/sbbt4032%28v=vs.80%29.aspx
Besser ist i.A. aber das Error Handling über Exceptions.

von Markus V. (Gast)


Lesenswert?

Läubi .. schrieb:
> Besser ist i.A. aber das Error Handling über Exceptions.

I.A. gebe ich Dir recht. Aber...

... unter C# sind Exceptions das, was man unter ALLEN Umständen 
vermeiden sollte.

Deren Umsetzung ist extrem langsam. Das simple Werfen und Fangen einer 
NullReferenceException kann schon mal 1 Sekunde Laufzeit verbraten!!! 
Das ist leider kein Witz. Ich konnte es auch nicht glauben und habe ein 
kleines Testprogramm mittels Profiler untersucht und die Aussage 
bestätigt gefunden.

Gruß
Markus

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Markus V. schrieb:
> Deren Umsetzung ist extrem langsam

Na und? Exceptions sind kein Returnwert sondern etwas ist "kaputt" man 
sollte nicht den Fehlerfall optimieren sondern den "common case".

Markus V. schrieb:
> kann schon mal

Naja man findet sicher immer Fälle wo irgendein Spezialfall einem die 
Suppe versalzt. Dafür ist die Fehlerbehandlung und vor allem die 
Nachvollziehbarkeit über einen Exceptiontrace meiner Meinung nach 
unverzichtbar, mal abgesehen davon, dass eine Exeption noch sehr viel 
Mehr Informationen tragen kann (u.A. halt auch einen Fehlertext) als ein 
simpler error code (welche eh von den meisten Leuten ignoriert wird ;).

von Peter II (Gast)


Lesenswert?

Markus V. schrieb:
> unter C# sind Exceptions das, was man unter ALLEN Umständen
> vermeiden sollte.

kann man überhaupt nicht vermeiden, wenn alles glieferten klassen und 
methoden haben es schon drin. Dafür müsste man die sprache komplett 
meiden.

> Deren Umsetzung ist extrem langsam. Das simple Werfen und Fangen einer
> NullReferenceException kann schon mal 1 Sekunde Laufzeit verbraten!!!
> Das ist leider kein Witz. Ich konnte es auch nicht glauben und habe ein
> kleines Testprogramm mittels Profiler untersucht und die Aussage
> bestätigt gefunden.
kann du uns mal das Testprogramm zeigen? hatte es eine extreme 
Verschachtelungstiefe oder irgendwelche anderne exotischen dinge?

Welche Version von .net hast du denn untersucht, es ist ja nicht so die 
die entwicklung bei 1.1 stehen geblieben ist?

von Markus V. (Gast)


Lesenswert?

Damit Ihr meine Behauptung nicht einfach nur glauben müsst: Selbst 
Microsoft räumt ein, dass es Performanceprobleme geben kann.

http://msdn.microsoft.com/en-us/library/ms229009.aspx

@Läubi
Ich hatte ja geschrieben, dass ich Dir im Allgemeinen recht gebe. Meine 
Kollegen und ich durften das Problem auf die harte Tour kennen lernen. 
Wir hatten Exceptions dazu verwendet, um in der Software Zustände, die 
nicht ganz der erwarteten Norm entsprachen, mit Exceptions ein paar 
Ebenen höher zu behandeln. Keine gute Idee, in C#. Zumindest dann nicht, 
wenn diese Zustände annähernd regelmäßig auftreten.

Ich habe das Testprogramm leider nicht mehr greifbar. Es war aber ein 
eigens konstruiertes Beispiel, ausschließlich dazu da, um die Laufzeit 
von throw/catch zu testen. Die Aufruftiefe war maximal 1 oder 2 Calls. 
Dort eine neue NullReferenceExcption erzeugt, geworfen und diese dann im 
Hauptprogramm per catch gefangen. Es dürfte damals mit VS2005, also .NET 
2.0 gewesen sein. Mit .NET 1.1 habe ich nie was gemacht.

Gruß
Markus

von Sebastian L. (Gast)


Lesenswert?

Also warum man heute noch alles mit Exceptions lösen muss verstehe ich 
wirklich nicht.

Errorcodes als Outparameter kann man bei der Programmierung nicht 
übersehen. Exceptions schon.

von Peter II (Gast)


Lesenswert?

Sebastian L. schrieb:
> Also warum man heute noch alles mit Exceptions lösen muss verstehe ich
> wirklich nicht.
>
> Errorcodes als Outparameter kann man bei der Programmierung nicht
> übersehen. Exceptions schon.

weil man sich damit viel code sparen kann, das ständig abgefrage von 
Return parameter nervt und auserdem kann man immer nur ein wert 
zurückgeben entweder einen Fehler oder einen Wert. In einem Fehlercode 
kann man auch keine Weiteren info reinpacken. Ich finde Exceptions gut.

von Sebastian L. (Gast)


Lesenswert?

Ob ich jetzt auf einen Errorcode prüfe oder eine exception fange.
Da kann ich mit einem errorcode ganz normal in meinem programm 
fortfahren und darauf reagieren.
nach jedem funktionsaufruf try catch ist doch blöde.

Peter II schrieb:
> auserdem kann man immer nur ein wert
> zurückgeben entweder einen Fehler oder einen Wert

das geht mit referenzen und out paramtern schon ganz gut

von Sebastian L. (Gast)


Lesenswert?

Da hab ich doch auch gleich den passenden artikel noch gefunden
http://www.guidetocsharp.de/ExceptionHandling.aspx


"Leistung und Ressourcenbedarf
 Im Zusammenhang mit Ausnahmen liest und hört man häufig, dass diese 
nicht eingesetzt werden sollten, da sie sehr leistungshungrig seien. Aus 
dieser Aussage ergibt sich direkt die Frage, wann Ausnahmen überhaupt 
eingesetzt werden sollten.

 Prinzipiell ergibt sich die Antwort auf diese Frage bereits aus dem 
Begriff einer Ausnahme: Sie stellen Ausnahmesituationen dar. Das heißt, 
Ausnahmen sind explizit nicht dazu gedacht, bedenkenlos an den 
verschiedensten Stellen innerhalb einer Anwendung eingesetzt zu werden. 
Sofern es möglich ist, einen Fehler im Vorfeld abzufangen, sollte dies 
dem Einsatz einer Ausnahme vorgezogen werden.

 Beispielsweise würde man in dem Beispiel, das die DivideByZeroException 
abfängt, in der Praxis keine Ausnahme einsetzen, sondern im Vorfeld mit 
Hilfe einer if-Abfrage prüfen, ob durch 0 geteilt werden soll. 
Insbesondere, wenn solche Berechnungen innerhalb von Schleifen 
auftreten, kann dadurch die Leistung der Anwendung durchaus gesteigert 
werden.

 Dies liegt daran, dass für jede Ausnahme, die ausgelöst wird, der 
Aufrufstapel ermittelt werden muss, was bei einer entsprechend tiefen 
Verschachtelung von Methodenaufrufen unter Umständen aufwändig sein 
kann.

 Obwohl Ausnahmen also nicht wahlfrei eingesetzt werden sollten, gibt es 
dennoch Fälle, in denen ihr Einsatz nicht verzichtbar ist. Dann nämlich, 
wenn Fehler nicht erwartbar sind und auf Ausnahmesituationen reagiert 
werden muss. In einem solchen Fall ist es in der Regel allerdings 
ohnehin nötig, den Benutzer zu informieren und ihn das weitere Vorgehen 
bestimmen zu lassen, weshalb es in einer solchen Situation nicht darauf 
ankommt, ob eine Ausnahme schnell oder langsam erzeugt wird - die 
Anwendung gelangt auf beide Arten zum Stillstand.

 Zusammengefasst lässt sich also sagen, dass Ausnahmen entgegen ihrem 
Ruf durchaus eingesetzt werden können, dass dies allerdings gezielt und 
mit Bedacht geschehen sollte. Insbesondere sollten Fehlersituationen 
bereits im Vorfeld vermieden werden, sofern dies möglich ist."



Fazit. In einem sauberem Modell sollten nach guter Anforderungsanalyse 
sehr wenige Exceptions drin sein.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Sebastian L. schrieb:
> Fazit. In einem sauberem Modell sollten nach guter Anforderungsanalyse
> sehr wenige Exceptions drin sein.

Nö, es sollten nur sehr wenige auftreten aber enthalten können 
beliebig viele sein, gerade in Unit-Tests sollte man auch testen, dass 
in Fehler/Ausnahmesituationen Exceptions auch tatsächlich geworfen 
werden. Auch bedeutet eine Exception nicht das man sie überall fangen 
muss (im Gegensatz zu einem Returnwert)
"Pseudobeispiel":
1
function String readMyData() {
2
 fh = open("blub.txt")
3
 line = readLine()
4
 close(fh)
5
 return line;
6
}
Hier muss bei open/read/(close) eine Fehlerbehandlung stehen und der 
"Schreiber" der Funktion muß wiederum für jeden verschiedenen Fall 
idealerweise einen anderen returnwert liefern sodass z.B. fehlerhaftes 
öffnen/datei nicht vorhanden/keine Rechte/fehler beim Lesen/... vom 
AUfrufer unterschieden werden können.
Mit Exceptions deklariere ich einfach das meine Funktion IOExceptions 
wirft. Die Verwendeten Funktionen ihrerseits werfen 
FileNotFound/Permissiondenied/ReadError welche von IOException ableiten.
Der Aufrufer kann (muss aber nicht wenn er seinerseits die Exception 
wieder weitergibt) nun die Fehler behandeln oder nicht, und für den 
"Schreiberling" ist es völlig egal ob die Exception in der ersten 
zweiten oder dritten Zeile auftrat und was es alles für 
Fehlersituationen geben könnte...

von Sebastian L. (Gast)


Lesenswert?

natürlich muss ich mich um exceptions kümmern.
Nicht gefangene exceptions reißen doch das ganze programm nieder.

Wie gibst du dass dann an den Benutzer weiter.

"Tut mir leid. Die Datei konnte nicht gelesen werden. Warum keine 
Ahnung."

Tolles Programm

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.