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);
   }
}
}

调用这个“ABORT”事件,我会停止这个类的执行(停止循环而不做任何其他事情)。我还可以在其他父表单中捕获此事件处理程序。不幸的是,我找不到任何停止执行此类的方法。

到目前为止的想法:

  1. 显而易见的答案是简单地设置一个标志并在多个地方反复检查这个标志,但我真的不喜欢这种方法(我当前的实现)。在每个方法调用(有很多)之后都必须检查这一点,这在代码方面是丑陋的。

  2. 我想也许是后台工作人员或您可以取消执行 DoWork 的东西?

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

您认为解决这种情况的最佳方法是什么?这些是最好的解决方案吗?是否有其他优雅的解决方案可以解决我想要的问题,还是我完全走错了方向?

编辑:我在整个代码中使用了一系列 try/catch 块,用于处理可能发生的不同错误。不幸的是,并非所有人都要求进行中止,因此需要立即抓住他们。因此,try/catch 不是最理想的方法.. 是吗?

4

2 回答 2

2

不要在构造函数中进行分析。在主要的 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;

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

于 2012-04-12T21:44:29.503 回答
1

如果出现问题,您能否抛出异常,并在循环中调用该方法的地方运行 try catch?

如果你这样做,你可以在类失败时做一些事情(你将把它放在catch中),并且你可以做一些事情来在完成后关闭与数据库++的连接。

或者您可以让方法返回一个 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;
}
}

您当然可以使用您的活动。为了简单起见,我只是将其删除。

于 2012-04-12T20:51:01.493 回答