Laden...

Fehlermeldung für den User

Erstellt von Ulf# vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.549 Views
U
Ulf# Themenstarter:in
170 Beiträge seit 2006
vor 16 Jahren
Fehlermeldung für den User

Hallo zusammen,

ich möchte nun in meiner Anwendung zur DB-Verwaltung(ACCESS), die Fehlermeldungen bei den Exceptions anpassen und per MsgBox ausgeben.

Z.Zt habe ich in fast jeder MsgBox

catch (Exception ex)

und

"Error"+ex.Message

stehen was für den 'User nicht grade optimal ist. Da ich aber knapp 100 MsgBox´s habe, weiss ich nicht so ganz wie ich die sache angehen soll, ausserdem sind in jeder Exception mehrere Fehler enthalten wie kann ich da die richtige Fehlermeldung ausgeben ?

Das wäre ja ein extremer Aufwand oder ?

Irgendwelche Vorschläge ?

Gruß
Ulf#

Ein Ziel ist nicht immer zum Erreichen da,
oft dient es nur zum richtigen Zielen...

Bruce Lee

U
Ulf# Themenstarter:in
170 Beiträge seit 2006
vor 16 Jahren

Wie könnte man gezielt Fehlermeldungen für den User bereitstellen ?

Ein Ziel ist nicht immer zum Erreichen da,
oft dient es nur zum richtigen Zielen...

Bruce Lee

J
3 Beiträge seit 2006
vor 16 Jahren

Hallo Ulf,

im Prinzip bin ich gerade an der selben Sache. Ausgangssituation: Ziehmlich grosse Solution mit ca. 20 Projekten und ich habe die Aufgabe, die Fehlermeldungen, die relativ allgemein gehalten sind und von unterschiedlichem Design geprägt (MessagboxIcons bzw. -Buttons usw.), zu vereinheitlichen und zu spezialisieren, je nach Kategorie Fehler.
Momentan werden so gut wie alle Fehler in den jeweiligen Projekten, genau wie bei dir mit

catch (Exception ex)
{
     MessageBox.Show("Error" + ex.Message);
}

abgefangen und per Messagebox mit allgemeiner Fehlermeldung an den User weitergeleitet.

Erste Überlegungen haben ergeben, dass es eventuell sinnvoll wäre, die Fehler die auftreten können, zu kategorisieren. (Fehler, Hinweis, Ausnahme usw. ... )Eine (statische) Klasse könnte vorgefertigte Messageboxen beinhalten, die ein einheitliches Design für diese Kategorien vorgibt, welches man dort zentral verwalten könnte. Also z.B. bei der Kategorie 'Fehler' - Icon = MessageBoxIcon.Error und Caption = "Fehler".
Der Text, der für den User ausgegeben werden soll, könnte dann als Parameter an die (statische) Methode übergeben werden.

Jetzt kommt der lästigste Teil: Um zu ermitteln, welchen Text man an den User übergibt, muss man spezielle Exceptions abfangen. Genau die, die durch die aufgerufenen Methoden und Operationen im try-Block ausgelöst werden können. Bei komplexen Blöcken können das eine ganze Menge sein. Aber schon eine einzige Operation kann mehrere Exceptions auslösen. Welche Fehler die verwendeten Methoden oder Operationen auslösen können, findet man in der MSDN-Dokumentation selbiger.

Hier ein Beipiel:

int value = 50;
int divisor = 0;
int calculated;

try
{
     calculated = value / divisor;
}
catch (DivideByZeroException) // Division durch 0?
{
     (Statische)Klasse.(statische)Methode("Division durch 0.");
}
 catch (ArithmeticException) // Arithmetic Exception?
{
     (Statische)Klasse.(statische)Methode("Eine arithmetic exception wurde ausgelöst.");
}
catch
{
     (Statische)Klasse.(statische)Methode("Eine unerwartete Exception wurde ausgelöst.");
}

Wichtig dabei ist, dass der catch-Block für die unerwartete Exception immer ganz unten steht.
Somit hast du die Möglichkeit immer eine spezielle Fehlermeldung auszugeben.

Ich hoffe da is jetzt was für dich dabei gewesen und vielleicht hat ja jemand noch andere und vielleicht sogar bessere Vorschläge für uns.

Grüße
-JD-

U
Ulf# Themenstarter:in
170 Beiträge seit 2006
vor 16 Jahren

Hallo JapeDogg,

das würde bedeuten, das jeder try-catch block alle exceptions beinhalten muss bzw ich müsste jede mögliche Fehlermeldung abfangen.

Das würee bedeuten ich muss 234 MsgBox´s bearbeiten 8o

Ein Ziel ist nicht immer zum Erreichen da,
oft dient es nur zum richtigen Zielen...

Bruce Lee

B
1.529 Beiträge seit 2006
vor 16 Jahren

Dann schreib eine statische Klasse, der du die Exception übergibst und eventuell noch weitere Informationen.
Die Klasse entscheidet dann, wie welche Exception angezeigt werden soll.
Damit hast du den Code nur einmal und ansonsten in jedem try-catch nur den Aufruf der statischen Methode.

Also:

try { ... }
catch( Exception ex )
{
   ExceptionHandler.Handle( ex );
}

// und
internal static class ExceptionHandler
{
   public static void Handle( Exception ex )
   {
      switch( ex.GetType() )
      {
         case typeof(DivideByZeroException):
            // ...
            break;
         case typeof(ArithmeticException):
            // ...
            break;
         // ...
         default:
            // ...
            break;
      }
   }
}
57 Beiträge seit 2006
vor 16 Jahren

Da schließe ich mich Borg an.
Ich würde aber keine Message Boxen verwenden, sondern einen eigenen Fehlerdialog. In diesem lassen sich die "Fehler" deutlich besser darstellen - z.B. im oberen Bereich ein Label mit allgemeinen Fehlerinformationen und evtl. Behebungsmöglichkeiten. Darunter ein "Details ..."-Button, der ein Textfeld mit dem Stacktrace ausklappt (Resize des Dialogs). Vielleicht noch ein "In die Zwischenablage übernehmen"-Button oder ein "Als Mail versenden"-Button oder oder oder.
Ich würde auf jeden Fall einen normalen Anwender nicht mit einem Stacktrace oder ähnlichen technischen Details belästigen, sowas interessiert ihn nicht und verstehen tut er es auch nicht. Solche Informationen sollten m.E. nur auf Anforderung dargestellt werden.

2 + 2 = 5 for large values of 2

J
3 Beiträge seit 2006
vor 16 Jahren

@Ulf:

...das würde bedeuten, das jeder try-catch block alle exceptions beinhalten muss bzw ich müsste jede mögliche Fehlermeldung abfangen.

Nein das ist nicht ganz richtig. Du musst nicht alle Exceptions abfangen die es im .Net-Framework gibt, sondern nur die, die aufgrund deiner Operationen im Try-Block auftreten können. Welche das sind kannst du wie gesagt in der MSDN-Dokumentation nachschlagen.

@Borg:

Ich finde die Idee nicht so gut, weil man im catch-Block nicht sehen kann welche Exceptions man wirklich abfängt. Zum anderen ist anzunehmen, dass die Methode Handle( Exception ex ) mal sehr groß wird und schlecht wartbar. Ausserdem kann es auch vorkommen, dass man auf eine bestimmte Exception mal so oder mal so reagieren möchte. Je nachdem wo sie ausgelöst wird. Das ist mit deinem Vorschlag nicht realisierbar. Ok, alles hat Vor und Nachteile. Aber mir überwiegen hier die Nachteile.

Grüße
-JD-

B
1.529 Beiträge seit 2006
vor 16 Jahren

Ist ja auch nur eine deutlich erweiterbare Grundidee. Man kann ja trotzdem bestimmte Exceptions abfangen, indem man einfach spezifischere catch-Blöcke davor hängt.