【问题标题】:try-catch block尝试捕获块
【发布时间】:2011-08-23 06:03:10
【问题描述】:

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

【问题讨论】:

  • 你尝试过 C# 泛型吗??
  • @Furqan:泛型将如何帮助解决这个问题?

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


【解决方案1】:

如果我理解这个问题,你不能有一个 try catch 块,但你可以从 catch 调用一个方法,这样所有方法都将共享相同的异常处理:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      但是,您也可以使用委托来执行此操作,即

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

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

      【讨论】:

        【解决方案4】:

        您要么必须在类中每个方法的内容周围添加try-catch,要么将范围提升到调用方法的位置并将它们包含在try-catch秒。

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

        【讨论】:

          【解决方案5】:

          您可以使用这种技术通过扩展方法包装一个动作

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

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              Aliostad 的答案最接近您的实际要求,这是一个非常酷的解决方案,但老实说,我认为这是重构代码的问题。正如 skaz 所说,它们都在做同样的事情这一事实意味着它们可能都可以合并到一个方法中。

              为了在不完全改变您开展业务的方式的情况下获得最接近您正在寻找的内容,我建议在您的解决方案中使用一个常见的错误处理类,以及一个扩展标准 Try-Catch sn- 的 sn-p p,但仍将足够的信息传递给您的处理程序,以便您可以进行一些特定的异常处理和自定义错误消息。

              您的自定义错误处理类应具有如下方法:

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

              我会为你的 sn-p 推荐这个或类似的东西。

                  <?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 方法 - 在我的 sn-ps 中,对于 web,我传递有关当前用户的信息,但您可以使用任何您想要的东西。

              祝你好运!

              亚当

              【讨论】:

              • 我忘了提 - 如果你不习惯使用 sn-ps,try sn-p 可能可以在 C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC 找到#\Snippets\1033\Visual C#\try.sn-p。要使用 sn-p,只需转到您的代码,键入 try 并按两次 tab。如果您以前从未使用过 sn-ps,您可能会印象深刻……我有点 sn-p 瘾君子,我经常使用其中大约 50 个 - 他们真的大大提高了我的工作效率——当然是 YMMV。祝你好运!
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-08-27
              • 2020-07-31
              • 2017-04-14
              • 2021-03-04
              相关资源
              最近更新 更多