try-catch块

时间:2011-05-11 11:48:36

标签: c# .net exception-handling try-catch

我有一个不同方法的类在读取文件时做同样的事情。 我想使用try-catch块进行异常处理。 我想询问是否有任何方法可以使所有方法进入单个try块,因为每个方法都会给出相同的异常“找不到文件”..

7 个答案:

答案 0 :(得分:3)

我首选的处理方式是从所有这些方法调用一个通用方法,因此每个(单独)看起来像:

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

但是,你也可以用代表来做,即

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

Execute(() => {open file});

答案 1 :(得分:3)

您可以使用此技术包含操作,使用扩展方法

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()();

所以基本上你可以用这个包装任何动作。

答案 2 :(得分:2)

如果我理解了您无法使用try catch块的问题,但您可以从catch调用方法,因此所有方法都将共享相同的异常处理:

try
{
    .... your code
}
catch (SomeException e)
{
    ExceptionHandler(e);
}

答案 3 :(得分:1)

您必须在类的每个方法的内容周围添加try - catch,或者在调用方法的位置上升到一个范围,并将其括在{{1 }} - tryŠ

没有办法对类中的每个方法应用相同的异常处理(如果有的话,我无论如何都不会推荐它。)

答案 4 :(得分:0)

你有“一堆方法做同样的事情”的事实似乎是问题的根源。你能把它变成一种方法吗?

此外,您可以将try catch块包装在正在调用的方法之外。这样调用者就可以进行异常处理 - 这些方法只需要抛出它们。

答案 5 :(得分:0)

如果您希望所有这些方法都在文件流上工作,您可以创建一个方法,该方法对文件流和文件名进行操作。在这个方法中捕获相关的异常,在你的情况下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.
      }
 }

答案 6 :(得分:0)

Aliostad的答案是最接近你实际要求的,这是一个非常酷的解决方案,但说实话,我认为这是重构代码的问题。正如斯卡兹所说,事实上他们都在做同样的事情意味着他们可能都被整合到一个方法中。

为了在不完全改变您的业务方式的情况下获得最接近您所寻找的内容,我建议在您的解决方案中使用常见的错误处理类,以及扩展标准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方法 - 在我的片段中,对于网络,我传递有关当前用户的信息,但您可以使用您喜欢的任何内容。

祝你好运!

亚当