C# 调用可能抛出内部捕获的方法
假设我们有一个使用的外部服务器(例如电话站等)。我们还有下一个代码:C# 调用可能抛出内部捕获的方法,c#,.net,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
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
生成的异常
问题是,对于这些情况,正确的模式是什么,以便我们正确地处理所有异常?您始终可以在第一个catch中嵌套另一个
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
}
您总是可以在第一个catch中嵌套另一个
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
}
别吵了。差不多
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(???);
}
TryCreateExternalCall当然应该记录异常和stacktrace,然后再接受并返回false。将其分解。差不多
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(???);
}
TryCreateExternalCall当然应该记录异常和stacktrace,然后再接受并返回false。您应该首先捕获最具体的异常,然后是最一般的异常
try
{
externalService.CreateCall(callParams);
}
catch (CreateCallExceptionType ccEx)
{
_callService.UpdateCallState(call, CallState.Disconnected, CallOutcome.Failed);
}
catch (Exception ex)
{
//do something
}
然后您可以在方法中处理UpdateCallState异常。您应该首先捕获最特定的异常,然后是最一般的异常
try
{
externalService.CreateCall(callParams);
}
catch (CreateCallExceptionType ccEx)
{
_callService.UpdateCallState(call, CallState.Disconnected, CallOutcome.Failed);
}
catch (Exception ex)
{
//do something
}
然后您可以在方法中处理UpdateCallState异常。在Catch块中抛出异常不是一个好的做法
try,Catch
建议
try
{
//make some changes. If something goes wrong go to Catch.
}
Catch(exception)
{
//I will clean the mess. Rollback the changes.
}
捕获异常,前提是您可以处理该异常。否则,让调用方决定如何处理异常。在Catch块中抛出异常不是一个好的做法
try,Catch
建议
try
{
//make some changes. If something goes wrong go to Catch.
}
Catch(exception)
{
//I will clean the mess. Rollback the changes.
}
捕获异常,前提是您可以处理该异常。否则,让调用方决定如何处理异常。单独调用它。不要嵌套可能的throable异常调用。这可能会使您的代码变得复杂,您将无法正常恢复任何状态。在这种情况下,如果呼叫创建因任何原因失败,您必须挂断。你得叫它,什么意思挂断?如果A调用引发异常,则创建一个失败标志,然后调用B,B可能再次引发任何异常。如果没有呼叫,则不呼叫B,因为未设置标志。嵌套异常将有问题。请单独调用它。不要嵌套可能的throable异常调用。这可能会使您的代码变得复杂,您将无法正常恢复任何状态。在这种情况下,如果呼叫创建因任何原因失败,您必须挂断。你得叫它,什么意思挂断?如果A调用引发异常,则创建一个失败标志,然后调用B,B可能再次引发任何异常。如果没有呼叫,则不呼叫B,因为未设置标志。嵌套异常将有问题。
UpdateCallState
如果CreateCall
没有引发exception@L.B-还有?在我看来,只有当CreateCall
失败时才应该进行该调用(基于传递的参数为callocome.Fail
)。另外,OP的代码最初就是这样工作的。在投票前试着理解这个问题!这也是原始代码所做的。请注意,似乎updatecallstate也需要在成功时执行,但这并不是问题所在。@Jamiec但在我看来,如果CreateCall
成功,则应该调用它。@L.B-同样,您所做的假设是OP从未问过的!我觉得OP希望在调用成功时UpdateCallState
,但他/她没有问这个问题。UpdateCallState
如果CreateCall
没有抛出exception@L.B-还有?在我看来,只有当CreateCall
失败时才应该进行该调用(基于传递的参数为callocome.Fail
)。另外,OP的代码最初就是这样工作的。在投票前试着理解这个问题!这也是原始代码所做的。请注意,似乎updatecallstate也需要在成功时执行,但这并不是问题所在。@Jamiec但在我看来,如果CreateCall
成功,则应该调用它。@L.B-同样,您所做的假设是OP从未问过的!我很清楚OP希望在调用成功时更新CallState
,但他/她并没有问这个问题。在这种情况下,您丢失了第一个异常。@Andrii Startsev-某种程度上说,在吞咽之前将其记录在底部,并返回false。问题是第二个例外的发生是因为第一个例外。如果你在其他地方调用catch块中的问题代码,它是否仍然会被炸成碎片。充其量我们只能说,它们可能在某个时候、某个时候有关联。在这种情况下,您丢失了第一个例外情况。@Andrii Startsev-某种程度上说,在吞咽之前将其记录在底部,并返回false。问题是第二个例外的发生是因为第一个例外。如果你在其他地方调用catch块中的问题代码,它是否仍然会被炸成碎片。充其量我们只能说他们可能在某个时候、某个时候有关联。