使用Catch从C#退出类

时间:2012-03-19 19:50:44

标签: c# winforms try-catch

我正在寻找在c#winforms类中处理错误的最佳方法。该应用程序的要点是它有一个数据分析器,可以分析统计数据和其他类似的东西。但是,我正在寻找处理ABORT的正确方法。

例如,我有一个名为Analyzer

的类
namespace PHOEBE
{
    public class Analyzer
    {
        public Analyzer(){
            DoAnalysis();
            DoFurtherAnalysis();
        }

    public class DoAnalysis(){
        try{
            Convert.ToInt32("someNumber...."); //obviously fails..
        }
        catch{
          //ERROR OCCURRED, ABORT ALL ANALYSIS
            return;
        }
    }
}

显然,当调用DoAnalysis()时,会发生错误。 catch块将捕获异常。但是,当发生此捕获时,它将返回到构造函数并运行DoFurtherAnalysis()。这是个问题。

我知道您可以从每个方法返回值,其中每个值表示某个结果(即1 =成功,0 =失败)。但是,我调用的很多方法都使用了返回值。我还可以使用一个在发生错误时被标记的布尔值,并在从构造函数调用下一个方法之前检查该值,但每次检查此值都很烦人且重复。

我真的希望有某种类似我可以使用的“中止机制”。还有其他解决方法吗?对此有任何有趣的解决方法吗?

假设从表单调用此类。

8 个答案:

答案 0 :(得分:11)

只是让异常传播起来 - 如果你真的可以处理它,你应该只捕获异常。例外 .NET中的“中止机制”。你现在正在吞咽一切都出错的信号,并且好像一切都好了就回来了。

一般来说,我发现捕获异常非常罕见 - 通常它位于顶层(因为一个请求阻止整个服务器停止)或者为了将一种异常转换为另一种异常保持适当的抽象。

答案 1 :(得分:6)

  

我真的希望某种类似于“中止机制”的我   可以用。还有其他解决方法吗?任何   为此有趣的解决方法?

是的,有。它被称为异常处理

让我们重写您的代码:

namespace PHOEBE
{
    public class Analyzer
    {
        public Analyzer()
        {
            try
            {
                DoAnalysis();
                DoFurtherAnalysis();
            }
            catch
            {
                //ERROR OCCURRED, ABORT ALL ANALYSIS
                return;
            }
        }

    public class DoAnalysis()
    {
        Convert.ToInt32("someNumber...."); //obviously fails..
    }
}

现在,构造函数将中止并且不会运行第二个方法,因为异常将“冒泡”并被捕获到您想要的位置。

关于不相关的说明:请尝试捕捉尽可能具体的例外情况,在这种情况下为FormatException

答案 2 :(得分:3)

您正在通过捕获您没有做任何事情并吞下它的异常来颠覆现有的“中止”机制。

在这种情况下,您不应该使用try{}catch{}块,并让异常冒泡并导致应用程序中止。

答案 3 :(得分:1)

最简单的解决方法是不会捕获异常。如果发生这种情况,它会直接通过DoFurtherAnalysis()函数并转到原始调用者。

答案 4 :(得分:1)

在返回并检查函数的bool返回值时,看不到任何令人讨厌的事情。这是一个更好的解决方案,然后有一些棘手的内部状态管理,你肯定会在几个月后回到你的代码时搞砸了。

让代码变得简单明了。这不是很烦人,这很好。

在您的具体情况下,如果您只想中止所有内容,请不要catch例外,否则会中止您的程序。

答案 5 :(得分:0)

在构造函数中使用try ... catch?

答案 6 :(得分:0)

嗯,你在这里混淆了几个问题。首先,看起来您可能从构造函数中进行非常昂贵的处理。如果该处理可以抛出,你真的不想从你的构造函数中调用它,因为你甚至没有选择返回错误代码。

其次,(你会在这里阅读许多帖子),你如何处理错误实际上取决于你的用户的应用程序和期望。输入的更改可以纠正一些错误。如果分析需要很长时间,并且您可能希望继续进行另一次分析,记录此错误,则其他可能会在半夜发生。

所以我认为我们真的会回复你,以获取有关上述内容的更多信息。

答案 7 :(得分:0)

您可以将DoFurtherAnalysis();移到try块

我会在构造函数之外的某个地方完成整个过程。 我在构造函数中所做的只是初始化属性。