错误敏感代码中的多个try-catch被认为是一种好的做法吗?

时间:2014-03-18 08:40:22

标签: c# exception-handling

我有一个代码段,负责编排几个模块的执行,并且它对错误非常敏感 - 我想确保我记录并警告每个发生的异常。

现在我有这样的事情:

try
{
    ModuleAResult aResult = ModuleA.DoSomethingA();
}
catch (Exception ex)
{
    string errorMessage = string.Format("Module A failed doing it's thing. Specific exception: {0}", ex.Message);
    // Log exception, send alerts, etc.
}
try
{
    ModuleBResult bResult = ModuleB.DoSomethingB();
}
catch (Exception ex)
{
    string errorMessage = string.Format("Module B failed doing it's thing. Specific exception: {0}", ex.Message);
    // Log exception, send alerts, etc.
}

// etc for other modules.

在我看来,多个try-catch使这个片段的可读性降低。这样做确实是正确的吗?

3 个答案:

答案 0 :(得分:1)

是的,这是对的。

但是你应该考虑到性能,也许最好将所有方法调用放在一个try / catch中,并在methiod本身的异常中添加堆栈跟踪和错误信息。

public void ModuleA.DoSomethingA()
{
    throw new Exception("Error in module A");
}

try
{
    ModuleAResult aResult = ModuleA.DoSomethingA();
    ModuleBResult bResult = ModuleB.DoSomethingB();
}
catch (Exception ex)
{
    // get information about exception in the error message
}

答案 1 :(得分:0)

你做得很好。

这样,您可以在每个模块之后处理错误。如果要运行它然后进行错误处理,请考虑以下替代方法:

try
{
    ModuleAResult aResult = ModuleA.DoSomethingA();
    ModuleBResult bResult = ModuleB.DoSomethingB();
}
catch(ModuleAException ex)
{
    // handle specific error
}
catch(ModuleBException ex)
{
    // handle other specific error
}
catch (Exception ex)
{
    // handle all other errors, do logging, etc.
}

答案 2 :(得分:0)

我认为这取决于你想要遵循的方法。

看起来你的错误消息对于引发异常的每个模块都是不同的,所以我猜你所遵循的方法是正确的。

你可以将整个事情放在一个很大的尝试中 - 然后在那种情况下你不会知道哪个模块导致异常,因为普通的excpetion被打印出来。

try
 {
    ModuleAResult aResult = ModuleA.DoSomethingA();
    ModuleBResult bResult = ModuleB.DoSomethingB();
 }
catch (Exception ex)
 {
   string errorMessage = string.Format("Either Module A or B failed", ex.Message);
// Log exception, send alerts, etc.
 }

因此,如果您希望异常处理不清晰,请使用上面的代码。 否则你所遵循的就绝对没问题了。