在对错误敏感的代码中进行多次try-catch被认为是一种良好的实践吗?

本文关键字:一种 认为是 try-catch 代码 错误 | 更新日期: 2023-09-27 17:50:53

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

现在我有这样的东西:

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使这个段的可读性降低了。这样做真的正确吗?

在对错误敏感的代码中进行多次try-catch被认为是一种良好的实践吗?

是的,这是正确的。

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

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
}

你做得很好。

这样,您可以在每个模块之后处理错误。如果您希望全部运行,然后进行错误处理,请考虑以下选择:

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.
}

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

似乎你的错误消息是不同的每个模块,引发异常,所以我猜你所遵循的方法是正确的。

你可以把整个东西放在一个大的try - catch块中,这样你就不知道是哪个模块导致了异常,因为输出的是泛型异常。

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.
 }

所以如果你不想让你的异常处理更干净,使用上面的代码。否则,你所遵循的绝对是好的。