блок try-catch - PullRequest
       30

блок try-catch

5 голосов
/ 11 мая 2011

У меня есть класс с разными методами, которые делают одно и то же, читая файл.Я хочу использовать блок try-catch для обработки исключений.Я хочу спросить, существует ли какой-либо способ, чтобы все методы входили в один блок try, поскольку каждый метод выдает одно и то же исключение «файл не найден» ..

Ответы [ 7 ]

3 голосов
/ 11 мая 2011

Вы можете использовать эту технику, чтобы обернуть действие , используя метод расширения :

public static class ActionExtensions
{
    public static Action WrapWithMyCustomHandling(this Action action)
    {
        return () =>
                {
                    try
                    {
                        action();
                    }
                    catch (Exception exception)
                    {

                        // do what you need 
                    }
                };
    }
}

public class DummyClass
{
    public void DummyMethod()
    {
        throw new Exception();
    }
}

и затем назовите его следующим образом:

DummyClass dummyClass = new DummyClass();
Action a = () => dummyClass.DummyMethod();
a.WrapWithMyCustomHandling()();

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

3 голосов
/ 11 мая 2011

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

try {
   // code
} catch(SomeExceptionType ex) {
   DoSomethingAboutThat(ex);
}

Однако вы также можете сделать это с делегатами, т.е.1004 *

void Execute(Action action) {
    try {
       // code
    } catch(SomeExceptionType ex) {
       // do something
    }
}

и

Execute(() => {open file});
2 голосов
/ 11 мая 2011

Если я понимаю вопрос, у вас не может быть одного блока try catch, но вы можете вызвать метод из catch, чтобы все методы имели одинаковую обработку исключений:

try
{
    .... your code
}
catch (SomeException e)
{
    ExceptionHandler(e);
}
1 голос
/ 11 мая 2011

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

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

0 голосов
/ 11 мая 2011

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

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

Ваш пользовательский класс обработки ошибок должен иметь метод, подобный следующему:

public void HandleError(Sysem.Reflection.MethodBase MethodBase, Exception Exception);

Это, или что-то подобное, я бы порекомендовал для вашего фрагмента.

    <?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 (Exception ex)
{
        YourErrorHandler.HandleError(System.Reflection.MethodBase.GetCurrentMethod(), ex);
}]]>
        </Code>
    </Snippet>
</CodeSnippet>

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

Удачи!

Адам

0 голосов
/ 11 мая 2011

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

Определение:

 private bool PerformActionOnFileStream(Action<FileStream> action, string path)
 {
      try
      {
           using(FileStream fileStream = new FileStream(@path, FileMode.Open))               
           {
                action(fileStream);
           }
      }
      catch(FileNotFoundException)
      {
           return false;
      }
 }

Использование:

 private void PrintContentOfFile(string path)
 {
      Action<FileStream> action = fileStream => PrintContentOfFileStream(fileStream);

      bool didPerformAction = PerformActionOnFileStream(action, path);
      if(!didPerformAction)
      {
           // Handle error.
      }
 }
0 голосов
/ 11 мая 2011

Тот факт, что у вас есть «куча методов, делающих одно и то же», кажется источником проблемы. Вы можете превратить это в один метод?

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

...