Можем ли мы настроить блок catch так, чтобы он включал в себя наши коды регистрации, каждый раз, когда мы окружаем try / catch? - PullRequest
0 голосов
/ 24 февраля 2012

всякий раз, когда нам нужно обработать исключение, мы окружаем блок try / catch, но когда мы окружаем блок try / catch, Visual Studio выдаст вот так.

try
{
}
Catch (Exception e)
{
  // here we need to write code for logging every time manually. 
}
  1. можем ли мы автоматизировать процесс блока catch с нашим собственным кодом регистрации исключений, который будет одинаковым все время.Что я имею в виду, всякий раз, когда я использую метод окружения, может автоматически включать наши собственные коды регистрации в блок исключений?Есть ли какой-либо инструмент или обходной путь?

  2. основная причина, по которой это нужно, многие jr.developer не будут обрабатывать исключения или журналирование, хотя мы и рассматриваем код, то, что я думал, сделает автоматизацию всякий раз, когда мы окружаем блок try / catch в нашемметод, который должен регистрироваться, в блоке catch он будет включать весь наш код регистрации.

может быть таким:

Catch(Exception e ) // i am telling it for a function, not as global catch handler. 
{                   // logging at method/function level. for method which we need to log
  ourLogging obj = new Ourlogging(); // these two line should added automaticaly, 
  obj.Publish(e);                   //as when user surrounded with try/catch block ? 
  obj = null; 
}
  1. , если есть какие-либо визуальные студийные дополнения или некоторые обходные пути, или если у любого тела есть какой-либо инструмент или скриптВыполнить эту задачу было бы полезно, многим коллегам-разработчикам.

Надеюсь, каждый понял мой вопрос.

Ответы [ 4 ]

3 голосов
/ 24 февраля 2012

Похоже, вам нужно отредактировать фрагмент кода, предоставляемый Visual Studio.Вы можете сделать это, изменив файл try.snippet, который обычно находится здесь:

C:\Program Files\Microsoft Visual Studio 10.0\VC#\Snippets\1033\Visual C#

Содержание этого файла по умолчанию:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>try</Title>
            <Shortcut>try</Shortcut>
            <Description>Code snippet for try catch</Description>
            <Author>Microsoft Corporation</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
                <SnippetType>SurroundsWith</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Declarations>
                <Literal>
                    <ID>expression</ID>
                    <ToolTip>Exception type</ToolTip>
                    <Function>SimpleTypeName(global::System.Exception)</Function>
                </Literal>
            </Declarations>
            <Code Language="csharp"><![CDATA[try 
    {           
        $selected$
    }

    catch ($expression$)
    {
        $end$
        throw;
    }]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

Youпросто нужно обновить блок try / catch между узлами <Code>.

1 голос
/ 24 февраля 2012

Вы можете написать класс, чтобы обернуть код try catch, передавая делегаты для выполнения внутри этого блока try, что-то вроде:

    public void ExecuteTryCatch<T>(Action<T> action, T genericParameter)
    {
        try
        {
            action.Invoke(genericParameter);
        }
        catch (Exception e)
        {
            //Do Logging
        }
    }

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

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

0 голосов
/ 24 февраля 2012

Я предлагаю вам найти решение AOP, чтобы вы могли применить аспект к вашему методу, и ваш пользовательский код try / catch помещается «автоматически» (фактически вводится инструментом).

Takeлут на этих примерах от Postsharp, отличного инструмента для AOP в .NET: http://www.sharpcrafters.com/postsharp/documentation. Ваши младшие разработчики могут просто поместить пользовательский атрибут в метод, который вы хотите обработать, с его исключением.

0 голосов
/ 24 февраля 2012

Вы знакомы с наконец (ссылка на MSDN) ?

Наконец, .NET гарантирует, что блоки выполняются каждый раз, независимо от того, выдано ли исключение.

Это само по себе не автоматизировано, но достаточно просто, чтобы стандартизировать код регистрации и вставить его в блок finally, где это необходимо.

...