调用可能抛出catch的方法

时间:2012-04-02 08:40:40

标签: c# .net

我们说我们有一个外部服务器,我们使用(例如电话站等)。我们还有下一个代码:

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生成的异常。

问题是,这些情况的正确模式是什么,以便我们正确处理所有异常?

4 个答案:

答案 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异常。