Как внедрить внутри блока catch, чтобы отправить исключение по электронной почте / смс / журнал событий в C # - PullRequest
0 голосов
/ 16 января 2011

Я хочу знать каждую исключительную ситуацию, пока она происходит.Я думаю, что мне нужно написать код в каждом блоке перехвата

  1. отправить письмо
  2. отправить смс
  3. записать его в файл журнала
  4. написать журнал событий и т. д.

    try {// do make} catch (Exception ex) {// send me ex ...}

Есть ли простой способвнедрить блоки catch без написания какого-либо кода?

PS: Пока я читаю ссылки на ответ, я наткнулся на несколько статей и хочу добавить квоты на свой вопрос.

Рекомендации по обработке исключений в .NET

Должны быть опубликованы общие обнаруженные исключения. В действительности не имеет значения, что вы используете для ведения журнала - log4net, EIF, Event Log,TraceListeners, текстовые файлы и т. Д. Что действительно важно: если вы поймали универсальное исключение, зарегистрируйте его где-нибудь.Но регистрируйте его только один раз - часто в коде используются блоки перехвата, в которых регистрируются исключения, и в результате получается огромный журнал, содержащий слишком много повторяющейся информации, чтобы быть полезным.

Ответы [ 4 ]

2 голосов
/ 16 января 2011

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

Что-то вроде:

[Serializable]
public class FooException : Exception
{
    // Logger configured for email, file, etc.
    static ILog _log = LogFactory.Create();

    public FooException(string message, Exception innerException)
        : base(message, innerException)
    {
        _log.Error(message, innerException);
    }

    // ...
}

public class FooDataAccess<T> : IFooRepository
{
    public T GetFoo()
    {
        // Consider creating general helper methods with 
        // Action, Func, parameters so that you only have
        // to code the try ... catch block once.
        try
        {              
            // all exceptions caught
        }
        catch (Exception e)
        {
            throw new FooException(Exceptions.GetFooException, e);
        }
    }     
}
1 голос
/ 16 января 2011

Вы можете использовать Spring.net , Unity или MEF , которые имеют открытый исходный код и имеют хорошую документацию и образцы через Интернет. но если у вас есть только эта проблема, я лично предпочту сделать это самостоятельно или использовать замыкания для решения этой проблемы.

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

1 голос
/ 16 января 2011

Вы можете использовать аспектно-ориентированное программирование с PostSharp .

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

0 голосов
/ 16 января 2011

Хотя идея получить каждое исключение кажется интересной, она может быть излишней.

По своему опыту я обнаружил, что наличие каркаса журналирования (такого как log4net), который настраивается во время выполнения, прекрасно справляется с этим сценарием.

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

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

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

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

Единственный недостаток, это то, что вам нужно быть внимательным в разбрасывании информации о каротаже, где бы у вас ни был блок улова.

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