在对错误敏感的代码中进行多次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中,并在方法本身的异常中添加堆栈跟踪和错误信息。
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.
}
所以如果你不想让你的异常处理更干净,使用上面的代码。否则,你所遵循的绝对是好的。