繁体   English   中英

try-catch块

[英]try-catch block

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

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

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

但是,你也可以与代表一起做,即

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

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

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

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

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

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

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

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

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

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

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

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

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

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

祝你好运!

亚当

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM