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.
        //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!