【问题标题】:Multiple methods with same try/catch logic [closed]具有相同尝试/捕获逻辑的多个方法[关闭]
【发布时间】:2019-01-21 08:16:59
【问题描述】:

我有一个 C# 程序,它有多个方法,具有不同的参数和不同的返回类型,但它们中的大多数都有一个具有相同异常逻辑处理的 try/catch 块。所有方法都有多个catch语句,但它们里面的逻辑对所有方法都是一样的。

有没有办法创建一个辅助方法,这样我就不会在 catch 中有重复的代码?

    public static async Task<long> Method1(string requestedKey)
    {
        try
        {
            //code
            return value;
        }
        catch (Exception1 ex)
        {
            Exception1Handler(ex);
        }
        catch (Exception2 ex)
        {
            Exception2Handler(ex);
        }
        catch (Exception3 ex)
        {
            Exception3Handler(ex);
        }
        catch (Exception ex)
        {               
        }

        return 0;
    }


    public static async Task<T> Method2(string key, string value)
    {
        try
        {
            //code
            return value;
        }
        catch (Exception1 ex)
        {
            Exception1Handler(ex);
        }
        catch (Exception2 ex)
        {
            Exception2Handler(ex);
        }
        catch (Exception3 ex)
        {
            Exception3Handler(ex);
        }
        catch (Exception ex)
        {               
        }

         return default(T);
    }

如何将 catch 语句分组到辅助方法中,这样我就没有重复的代码?

【问题讨论】:

  • 是的。如果您要添加代码示例,我相信有人会花时间给您一个示例,说明如何做。
  • "创建一个辅助方法" 这正是你应该做的。你这样做有什么问题吗?你尝试了什么,你到底卡在哪里?
  • 是 - 删除所有 try .. catch 块。仅处理您想要处理的异常,如果由于用户输入而发生异常,请进行验证而不是抛出异常。否则,将它们全部捕获到顶层并向用户提供友好的消息。
  • 您的代码看起来像this question 中的代码吗?如果是这样,那里的答案应该适用。如果没有,您的代码确实看起来如何的一些具体示例将非常有帮助。

标签: c# .net try-catch catch-block


【解决方案1】:

如果是为了避免重复catch块,可以使用下面的方法

public void HandleException(Action action)
{
    try
    {
        action();
    }
    catch (Exception1 e)
    {
        // Exception1 handling
    }
    catch (Exception2 e)
    {
        // Exception2 handling
    }
    catch (Exception3 e)
    {
        // Exception3 handling
    }
    catch (Exception e)
    {
        // Exception handling
    }
}

...

HandleException(() => /* implementation */)

【讨论】:

  • OP 的示例展示了一些功能(使用异步任务/等待)。但我认为,类似的模式也适用。如果出现异常,我只会为 Default-Return 添加一个参数(参见示例)。
【解决方案2】:

而不是这个:

void AA(string B)
{
    try
    {
        //Do something
    }
    catch (Exception)
    {
        //Do something else
    }
}

void AA(string B, string C)
{
    try
    {
        //Do something
    }
    catch (Exception)
    {
        //Do something else
    }
}

并一遍又一遍地键入相同的异常(我假设它们会完全相同,因为您在问题中这么说) 你可以这样做:

void CallerMethod()
{
    try
    {
        AA("");
        AA("", "");
    }
    catch (Exception)
    {
        //My only one exception
    }
}

void AA(string B)
{
    //Do something
}

void AA(string B, string C)
{
    //Do something
}

这样,如果你的任何重载方法会抛出异常,你只能从一个地方处理它们

【讨论】:

  • 您的代码库中仍然会有重复的异常处理代码...
猜你喜欢
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 2021-06-07
  • 1970-01-01
相关资源
最近更新 更多