Catch块中IF语句的最佳实践

时间:2014-01-15 19:32:10

标签: c# exception design-patterns

我有以下方法:

public static addSomething(int id)
{
    string msg = getStringMsg(id);
    try
    {
        //do lots of stuff
        Console.WriteLine(msg)
    }
    catch (Exception e)
    {
        if (id == 1)
            throw new Exception("Exception msg 1: " + msg);
        else
            throw new Exception("Exception msg 2: " + msg);
    }
}

在catch块中有一个像这样的条件分支吗?如果是这样,我的替代方案是什么?

我想我能做到:

public static addSomething(int id)
{
    string msg = getStringMsg(id);
    string exceptionMsg;
    if (id == 1)
        exceptionMsg = "Exception msg 1: " + msg);
    else
        exceptionMsg = "Exception msg 2: " + msg);
    try
    {
        //do lots of stuff
        Console.WriteLine(msg)
    }
    catch (Exception e)
    {
        throw new Exception(exceptionMsg);
    }
}

但我真的希望将try块之外的代码保持在最低限度,如果有的话。这是我的第二个问题:我是否可以将getStringMsg(id)分配给msg块内的try,但仍然可以在catch块中访问它?

3 个答案:

答案 0 :(得分:4)

我建议您在发生错误之前避免错误消息的创建。另外我建议将原始异常作为内部异常传递给你抛出的异常(如果你想把它扔到应用程序的更高级别,最好创建一些自定义异常):

public static void addSomething(int id)
{
    string msg = getStringMsg(id);
    try
    {
        //do lots of stuff
        Console.WriteLine(msg)
    }
    catch (Exception e)
    {
        string errorMessage = (id == 1) ? 
           "Exception msg 1: " : "Exception msg 2: ";

        throw new FooException(errorMessage + msg, e);
    }
}

答案 1 :(得分:2)

我相信,根据您的参数try,您的conditional logic广告块还有很多id。在这种情况下,最好将实现拆分为单独的方法,每个方法都有自己的try catch块。

还要考虑重构 - replace conditional with polymorphism

答案 2 :(得分:0)

没关系,但你应该把抛出的异常作为你抛出的内部异常传递:

catch (Exception ex)
{
    ...
      throw new Exception("message", ex);
    ...
}

如果您想重新抛出句柄异常,只需键入throw;即可。不要再扔了。有很多关于差异的文章以及为什么单个单词陈述 - throw - 是最好的。