Регистрация исключений и отправка электронной почты - PullRequest
3 голосов
/ 16 марта 2012

Правильн ли следующий метод обработки исключений?Мне трудно регистрировать ошибку и, наконец, отправить файл журнала по электронной почте.Где я могу написать код для регистрации ошибки и отправки электронной почты?

Основная проблема, которую я получаю, заключается в том, что когда исключение генерируется в SomeClass1, оно регистрируется два раза - во второй раз из SomeClass2.Является ли хорошей идеей создать отдельный пользовательский тип исключения (SomeException в примере) и обернуть System.Exception всякий раз, когда это происходит?

Также я не совсем понимаю, как и когда показывать сообщение об ошибкеконечный пользователь, когда у нас есть цепочка try-ловцов, вызывающих друг друга.

class SomeClass1
{
    public static DataExtract(string sourcepath)
    {
        try
        {
            OleDbConnection oledb = new OleDbConnection();
            oledb.ConnectionString = "someconnectionstring";
            CompanyOLEDB.Open();
        }
        catch (Exception e)
        {
            throw new CustomException(e);
        }
    }
}

class SomeClass2
{
    private void SomeMethod()
    {
        try
        {
            // some code
            // some code

            SomeClass1.DataExtract()
        }
        catch (Exception e)
        {
            throw new CustomException(e);
        }
    }
}

public class CustomException : Exception
{
    protected CustomException() { }

    public CustomException(Exception e)
    {
        Log(e);
    }

    public CustomException(ExceptionType type)
    {
        this.Data.Add("Type", type);
        this.Data.Add("Message", "No message specified");
    }

    public CustomException(ExceptionType type, string message)
    {
        this.Data.Add("Type", type);
        this.Data.Add("Message", message);
    }

    public static void Log(Exception e)
    {
        System.IO.File.WriteAllText(Logfile.txt", e.ToString());
    }

    public static void Sendmail()
    {
        ExceptionMail.Sendmail();
    }
}

Ответы [ 2 ]

5 голосов
/ 16 марта 2012

Правильн ли следующий метод обработки исключений?

Нет.Есть несколько вопросов.Вот два самых важных из них.

1.Вы не должны ловить исключения, которые вы не можете обработать

Довольно важно.Все блоки исключений, которые просто перебрасывают или регистрируют исключения, загромождают код без добавления какого-либо значения.Перехватывайте все исключения только в верхнем слое (в веб-службе, контроллере MVC, в фоновом потоке и т. Д.), Чтобы предотвратить сбой приложения.(однако иногда лучше разрешить сбой приложения).

Исключение было обработано, если метод может вернуть ожидаемое значение.

2.Всегда включайте исходное исключение

Вы скрываете информацию, которая важна для предотвращения ее использования в будущем, когда вы копируете только частичную информацию из исходного исключения.

Если выдолжен поймать / выбросить другого, вы должны сделать это так:

public class CustomException : Exception
{
    public CustomException(string msg, Exception inner) : base(msg, inner){}
}

// и в методе:

public void DoSomething()
{
    try
    {
        SomeCoolOp();
    }
    catch (Exception err)
    {
        throw new CustomException("Tried to allocate some cool stuff", err);
    }
}

Изменения по сравнению с вашим кодом:

  1. Мы включили исходное исключение в способ, которым Microsoft рекомендует
  2. Мы пишем operation specific сообщение, то есть описывает, что мы пытались сделать, когда произошло исключение (вместо использования исходного сообщения)

Дополнительная информация

Я написал несколько постов в блоге об обработке исключений.

Вы можете начать с чтения: http://blog.gauffin.org/2010/11/do-not-catch-that-exception/

А потом прочитайте остальные: http://blog.gauffin.org/tag/exceptions/

2 голосов
/ 16 марта 2012

возможно, рассмотрите возможность использования чего-то вроде ELMAH , очень похожего на Log4Net, его можно настроить так, чтобы оно записывало ошибки в файлы, таблицы БД или электронную почту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...