我有一个代码段,负责编排几个模块的执行,并且它对错误非常敏感 - 我想确保我记录并警告每个发生的异常。
现在我有这样的事情:
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使这个片段的可读性降低。这样做确实是正确的吗?
答案 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.
}
因此,如果您希望异常处理不清晰,请使用上面的代码。 否则你所遵循的就绝对没问题了。