我们说我们有一个外部服务器,我们使用(例如电话站等)。我们还有下一个代码:
try
{
externalService.CreateCall(callParams);
}
catch (Exception ex)
{
_log.Error("Unexpected exception when trying execute an external code.", ex);
_callService.UpdateCallState(call, CallState.Disconnected, CallOutcome.Failed);
throw;
}
理论上UpdateCallState
可能会抛出,但我们会使用该代码隐藏此异常,并且只会以正确的方式处理由CreateCall
生成的异常。
问题是,这些情况的正确模式是什么,以便我们正确处理所有异常?
答案 0 :(得分:4)
你总是可以在第一个捕获中嵌套另一个try..catch
并适当地处理它。
try
{
externalService.CreateCall(callParams);
}
catch (Exception ex)
{
_log.Error("Unexpected exception when trying execute an external code.", ex);
try
{
_callService.UpdateCallState(call, CallState.Disconnected, CallOutcome.Failed);
}
catch(Exception updateEx)
{
// do something here, don't just swallow the exception
}
throw; // this still rethrows the original exception
}
答案 1 :(得分:0)
分手。像
这样的东西if !TryCreateExternalCall(callParams)
{
_log.Error("Unexpected exception when trying execute an external code.", ex);
_callService.UpdateCallState(call, CallState.Disconnected, CallOutcome.Failed);
}
else
{
throw new ExternalServiceException(???);
}
TryCreate ExternalCall当然应该在吞下并返回false之前记录异常和堆栈跟踪。
答案 2 :(得分:0)
在Catch块中抛出异常不是一个好习惯。
try, Catch
建议
try
{
//make some changes. If something goes wrong go to Catch.
}
Catch(exception)
{
//I will clean the mess. Rollback the changes.
}
仅在您可以处理异常时才捕获异常。其他泡沫,让调用者决定如何处理异常。
答案 3 :(得分:-1)
您应首先捕获最具体的异常,然后是最常见的异常。
try
{
externalService.CreateCall(callParams);
}
catch (CreateCallExceptionType ccEx)
{
_callService.UpdateCallState(call, CallState.Disconnected, CallOutcome.Failed);
}
catch (Exception ex)
{
//do something
}
然后你可以在方法中处理UpdateCallState异常。