尝试捕获不良实践流程控制困境

时间:2015-07-10 03:37:17

标签: exception exception-handling try-catch

我知道在使用try-catch块的程序上执行流控制是不好的做法,但是当错误捕获需要时我无法看到如何以另一种方式执行此操作重定向代码的执行。

例如,假设我有用户单击按钮的屏幕,然后在按钮上单击我执行一些代码。代码结束执行后,我将用户重定向到新屏幕....

...但是代码执行可能会失败,在这种情况下,我需要让用户知道失败并将他重定向到上一个屏幕。

我将采用的方式是(C#示例,但我认为这更像是一个与语言无关的问题,更像是一般的编码方法):

try
{
     ExcuteCode();  // Some code that can throw some Exception, it can be a .NET framework method or something else.
     NavigateToNextScreen();
} 
catch(Exception e) 
{
     Log.Write(e);
     ShowErrorMessage();
     GoBack();
} 

即使我将其更改为:

bool hasError = false;

try
{
     ExecuteCode();
} 
catch(Exception e) 
{
      Log.Write(e);
      ShowErrorMessage();
      hasError = true;
 } 

  if(hasError) { GoBack(); } 
  else { NavigateToNextScreen();} 

它仍然在try-catch块内执行流量控制

那么,是否有一种推荐方法可以正确处理这种情况并避免这种不良做法?

2 个答案:

答案 0 :(得分:0)

修改

如果您可以控制ExecuteCode(),则不是抛出错误而是返回null或false值,并使用它来检查是前进还是后退。

原始

如果你总是在catch语句之后返回并在try的结尾处放置前进代码,如下所示:

try
{
    ExecuteCode();
    NavigateToNextScreen();
} 
catch(Exception e) 
{
    Log.Write(e);
    ShowErrorMessage();
} 
GoBack(); 

现在返回是默认值,只有在一切正确执行后才会继续。

答案 1 :(得分:0)

你在寻找明显的吗?

try
{
    if ( ExcuteCode() == false)
    {
        ShowErrorMessage();
        GoBack();
    }
    else
    {
        NavigateToNextScreen();
    }
} 
catch(Exception e) 
{
     Log.Write(e);
     ShowErrorMessage();    
     // handle critical error
}