2012-04-12 28 views
1

我打算提供一个我正在尝试做的简单示例 - 希望这有可能吗?使用事件或..从类执行返回?

我基本上有一个类可以完成整个格式/分析数据。因此,有很多事情可能会出错。我遇到的问题是在出现问题时处理课程。我希望这个类的所有执行都在发生错误后停止。

这个类(AnalyzingStuff)是从父窗体调用的,它根据这个类的执行结果做各种事情。

理想情况下,我会触发一个名为“ABORT”的事件。

因此,在这里这个代码我做到以下几点:

Class AnalyzingStuff{ 

public event EventHandler ABORT; 

public AnalyzingStuff(){ 

    for(int i = 0; i < 999999; i ++){ 
     AnalyzeSomeStuff(); 
     AnalyzerSomeOtherStuff(); 
    } 
    MoreStuff(); 
    OtherStuff(); 
} 

private void AnalyzeSomeStuff(){ 
    if(someconditionNotMet){ 
     //EXIT OUT OF THIS CLASS, STOP EXECUTION!!! 
     this.ABORT.Invoke(this, null); 
    } 
} 
} 

调用此“中止”的事件,我会停止这个类的执行(停止循环并没有做任何事情)。我也可以在其他一些父窗体中捕获此事件处理程序。不幸的是,我找不到任何停止这个类的执行的方法。

想法而已:

  1. 显而易见的答案是简单地设置一个标志,不断在多个地方一遍又一遍地检查这个标志,但我真的不喜欢这种做法(我目前的执行情况) 。不得不在每一个方法调用之后检查这个(有很多)代码是很难看的。

  2. 我想也许是一个后台工作者,或者你可以取消DoWork的执行?

  3. 使用表单作为AnalyzingStuff的基类,因此我可以简单地调用“this.Close();”。

您认为这种情况的最佳方法是什么?这些是最好的解决方案吗?是否还有其他优雅的解决方案可以满足我的需求,或者我会完全朝着错误的方向发展?

编辑:我有一系列的try/catch块用于整个代码,用于处理可能发生的不同错误。不幸的是,并非所有人都要求中止发生,所以他们需要立即被抓住。因此,尝试/捕捉不是最理想的方法..或者它是什么?

回答

2

不要在构造函数中进行analysys。在主Analyze()方法中执行。

使用例外。如果您想因致命错误而中止,请抛出致命异常。也就是说,抛出一个你不能在主分析方法范围内捕捉到的异常。

class Analyzer 
{ 
    public Analyzer() 
    { 
     // initialize things     
    } 

    public void Analyze() 
    { 
     // never catch a fatal exception here 
     try 
     { 
      AnalyzeStuff(); 
      ... optionally call more methods here ... 
     } 
     catch (NonFatalException e) 
     { 
      // handle non fatal exception 
     } 

     ... optionally call more methods (wrapped in try..catch) here ... 
    } 

    private void AnalyzeStuff() 
    { 
     // do stuff 
     if (something nonfatal happens) 
      throw new NonFatalException(); 

     if (something fatal happens) 
      throw new FatalException(); 
    } 
} 

外:

{ 
    var analyzer = new Analyzer(); 
    try 
    { 
     analyzer.Analyze(); 
    } 
    catch (FatalException) 
    { 
     Console.WriteLine("Analysis failed"); 
    } 
} 

如果你不喜欢使用异常这样,你可以通过让每一个分析方法返回一个布尔完成同样的事情:

if (!AnalyzeStuff()) 
    return false; 
if (!AnalyzeMoreStuff()) 
    return false; 
... 
return true; 

但你最终会得到很多返回语句或大量的大括号。这是一个风格和偏好的问题。

1

如果事情出错了,你可以抛出一个异常,并且在循环中调用方法的地方试一下吗?

如果你这样做,你可以做的东西,如果类失败(你将放入捕获),和你可以做的事情来关闭数据库++的连接,当它完成。

或者你可以让方法返回一个int来判断方法的执行是否有效。恩。返回0;是有效执行,返回1-500可能会是不同的错误代码。或者你可以去传递一个布尔的简单版本。如果您需要从错误代码以外的方法返回值,您可以将它们作为OUT变量传递。示例如下:

Class AnalyzingStuff{ 

public AnalyzingStuff(){ 

    for(int i = 0; i < 999999; i ++){ 
     if (!AnalyzeSomeStuff() || !AnalyzerSomeOtherStuff()) 
      break; 
    } 
    MoreStuff(); 
    OtherStuff(); 
} 

private bool AnalyzeSomeStuff(){ 
    if(someconditionNotMet){ 
     return false; 
    } 
return true; 
} 
} 

您当然可以使用您的活动。我只是为了简单而删除它。

+0

有效的解决方案。我唯一遇到的问题是我使用了一系列的尝试和捕获来找出可能发生的其他异常。不是所有的我都想要发生ABORT。 – ImGreg 2012-04-12 20:57:45

+0

以另一种方式更新答案,而不使用例外情况。 – 2012-04-13 08:52:50