C# Catch块中IF语句的最佳实践

C# Catch块中IF语句的最佳实践,c#,exception,design-patterns,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("Exceptio

我有如下方法:

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)
分配给
try
块中的
msg
,但仍然可以在
catch
块中访问它?

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


我相信您的
try
块也有许多基于参数
id
条件逻辑。在这种情况下,最好将实现拆分为单独的方法,每个方法都有自己的
try-catch


也考虑重构-

这很好,但是你应该把抛出的异常作为你抛出的内部异常:

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

如果您想要重新抛出句柄异常,只需键入
throw。不要再扔了。关于这种差异以及为什么单词语句--
throw
-最好的原因,有很多文章都在讨论。

+1对于代码可读性的多态性链接,我个人将使用您的第一个示例。我的问题是,为什么你不只是把e.Message、msg和id格式化成你需要的格式,然后把它们泡起来呢。通常,catch块用于恢复应用程序,而不是用于业务逻辑。还有一个问题-您真的需要将
getStringMsg(id)
返回的
msg
添加到错误消息中吗?你需要在你的很多东西中做什么?
msg
id
,或者两者都需要?第一个问题的答案是肯定的。这是一个非常简化的版本,可以抓住问题的核心。是的,我需要
msg
id
中的
//很多东西。在阅读了它们之后,我真的认为你应该创建一个类,而不是传递ID。根据ID,似乎有很多不同的功能,这些功能应该存储在一个集中的地方。@the_lotus:我完全同意你的观点,但不幸的是,设计决策不是由我决定的。
catch (Exception ex)
{
    ...
      throw new Exception("message", ex);
    ...
}