Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用可能抛出内部捕获的方法_C#_.net - Fatal编程技术网

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块中的问题代码,它是否仍然会被炸成碎片。充其量我们只能说他们可能在某个时候、某个时候有关联。