Feedback

C# - Fehlermeldung in E-Mail oder txt-Datei speichern

Veröffentlicht von am 17.12.2012
(2 Bewertungen)
Dieses Snippet sendet die Fehlermeldungen, die Ihr Programm auswirft, automatisch an Ihre E-Mail-Adresse, damit Sie diese analysieren können. Alternativ ist es auch möglich, diese Meldungen in einer txt-Datei zu speichern.

Achtung: Dazu ist ein E-Mail-Zweitkonto notwendig, von dem aus die Nachrichten versendet werden.
GFU-Schulungen  [Anzeige]

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

VB.NET 2017/2015/2013 Einführung

Das Seminar befähigt Sie zur eigenständigen Entwicklung von anwenderorientierten Programmen in VB.NET, worin auch der Einsatz von Datenbanken enthalten ist.

        //using System.Net;
        //using System.Net.Mail;
        //using System.IO;

        private void fehler(Exception ex)
        {
            //Variablen initialisieren
            string Name = "Max"; //Wichtig für die Fehlermeldung an den Benutzer

            //Um eine E-Mail an Ihr Konto zu schicken, benötigen Sie einen zweiten Account, von dem Sie aus die Nachricht versenden
            string EMailadresse = "beispiel@gmail.com"; //E-Mail-Adresse, von der aus die Nachricht gesendet wird
            string Passwort = "passwort"; //Passwort der E-Mail-Adresse, von der aus die Nachricht gesendet wird
            string Host = "smtp.googlemail.com"; //SMTP-Server des E-Mailanbieters (http://www.patshaping.de/hilfen_ta/pop3_smtp.htm)
            int Port = 587; //Port des E-Mailanbieters


            string EMailadresse_Empfänger = "beispiel2@gmail.com"; //E-Mail-Adresse, an die die Nachricht gesendet wird

            //Zusammenfassung der Fehlermeldung
            string Fehlermeldung = ex.ToString();
            Fehlermeldung = Fehlermeldung.Replace(": ", "\r\n" + "\r\nBeschreibung: ");
            Fehlermeldung = Fehlermeldung.Replace("   ", "\r\nOrt: ");
            string Ausgabe = "Meldung: " + Fehlermeldung + "\r\n\r\n" +
                "Uhrzeit: " + DateTime.Now.ToString("HH:mm:ss") + "\r\n" +
                "Datum: " + DateTime.Now.ToString("dddd") + ", den " + DateTime.Now.ToString("dd.MM.yyyy") + "\r\n" +
                "Version: " + System.Windows.Forms.Application.ProductVersion;

            //MessageBox an den Benutzer
            DialogResult dr = MessageBox.Show("Es ist folgender Fehler aufgetreten:" + "\r\n" + ex.Message + "\r\n\r\n" +
                "Möchten Sie die Fehlermeldung an \"" + Name + "\" senden?", "Fehler", MessageBoxButtons.YesNo, MessageBoxIcon.Error);

            if (dr == DialogResult.Yes)
            {
                try
                {
                    //E-Mail wird versendet
                    System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
                    MailAddress from = new MailAddress(EMailadresse);
                    mail.To.Add(EMailadresse_Empfänger);
                    mail.From = from;
                    mail.Subject = "Fehlermeldung: " + System.Windows.Forms.Application.ProductName;
                    mail.Body = Ausgabe;
                    SmtpClient client = new SmtpClient(Host, Port);
                    client.EnableSsl = true;
                    System.Net.NetworkCredential nc = new NetworkCredential(EMailadresse, Passwort);
                    client.Credentials = nc;
                    client.Send(mail);

                    MessageBox.Show("Der Bericht wurde erfolgreich versendet!", "Fehlerbericht wurde gesendet", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                }
                catch
                {
                    //Ein Fehler beim Versenden ist aufgetreten
                    DialogResult dr2 = MessageBox.Show("Die Fehlermeldung konnte nicht versendet werden!" + "\r\n" +
                        "Möchten Sie stattdessen die Fehlermeldung speichern?", "Fehler", MessageBoxButtons.YesNo, MessageBoxIcon.Error);

                    if (dr2 == DialogResult.Yes)
                    {
                        //Die Fehlermeldung wird gespeichert
                        SaveFileDialog sfd = new SaveFileDialog();
                        sfd.InitialDirectory = "C:/";
                        sfd.Filter = "Textdatei (*.txt)|*.txt";
                        sfd.Title = "Dateispeicherort angeben";
                        sfd.FileName = DateTime.Now.ToString("dd.MM.yyyy_HH-mm-ss") + " Fehler " + System.Windows.Forms.Application.ProductName;

                        if (sfd.ShowDialog() == DialogResult.OK)
                        {
                            FileStream fs;
                            StreamWriter sw;
                            string dateiname = sfd.FileName;
                            fs = new FileStream(dateiname, FileMode.Create);
                            sw = new StreamWriter(fs);
                            sw.Write(Ausgabe);
                            sw.Close();
                        }
                    }
                }
            }
            else
            {
                DialogResult dr3 = MessageBox.Show("Möchten Sie stattdessen die Fehlermeldung speichern?", "Fehlermeldung speichern", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (dr3 == DialogResult.Yes)
                {
                    //Die Fehlermeldung wird gespeichert
                    SaveFileDialog sfd = new SaveFileDialog();
                    sfd.InitialDirectory = "C:/";
                    sfd.Filter = "Textdatei (*.txt)|*.txt";
                    sfd.Title = "Dateispeicherort angeben";
                    sfd.FileName = DateTime.Now.ToString("dd.MM.yyyy_HH-mm-ss") + " Fehler " + System.Windows.Forms.Application.ProductName;

                    if (sfd.ShowDialog() == DialogResult.OK)
                    {
                        FileStream fs;
                        StreamWriter sw;
                        string dateiname = sfd.FileName;
                        fs = new FileStream(dateiname + ".txt", FileMode.Create);
                        sw = new StreamWriter(fs);
                        sw.Write(Ausgabe);
                        sw.Close();
                    }
                }
            }
        }

        //So verwenden Sie die Methode innerhalb eines Catch-Blocks
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {

            }
            catch (Exception ex)
            {
                fehler(ex);
            }
        }
Abgelegt unter E-Mail, Fehlermeldung, Bericht, senden, speichern.

2 Kommentare zum Snippet

spezi schrieb am 20.12.2012:
Sorry, aber das kann man eigentlich nur mit 1 bewerten. Ich sage Ihnen auch wieso:
1. Unnötig viele String-Allokationen. Die Replaces sind unnötig und fehleranfällig (was ist, wenn Microsoft etwas an der Formatierung ändert?) - ein Entwickler wird auch ohne diese etwas mit der Exception anfangen können. Um die komplette Nachricht zusammen zu bauen empfehle ich den StringBuilder.
2. Der komplette Code in einer Methode -> schlechter Programmierstil
3. Verwenden von Betriebssystemressourcen (konkret: Streams) ohne sicherzustellen, dass diese sicher wieder aufgeräumt werden (Tipp: using-keyword). Noch einfacher gehts mit der File-Klasse, z.B. per WriteAllText-Methode.
4. Das Gleiche kann man mittels Logging-Framework (z.B. log4net) einfacher und konfigurierbarer erreichen.
dariusarnold schrieb am 03.01.2013:
@spezi: ICH wüsste nicht wie! Dann poste du doch mal das gleicher in grün/besser.
Ich find die Idee an sich nämlich super...
 

Logge dich ein, um hier zu kommentieren!