Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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
使用Catch从C#退出类_C#_Winforms_Try Catch - Fatal编程技术网

使用Catch从C#退出类

使用Catch从C#退出类,c#,winforms,try-catch,C#,Winforms,Try Catch,我正在寻找处理c#winforms类中错误的最佳方法。该应用程序的要点是,它有一个数据分析器,用于分析统计数据和其他类似的数据。然而,我正在寻找处理流产的正确方法 例如,我有一个名为Analyzer的类 namespace PHOEBE { public class Analyzer { public Analyzer(){ DoAnalysis(); DoFurtherAnalysis(); }

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

例如,我有一个名为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块将捕获异常。但是,当发生此捕获时,它将返回构造函数并运行doFutureAnalysis()。这是一个问题

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

我真的很希望我能使用一些类似“中止机制”的东西。有没有其他办法解决这个问题?有什么有趣的解决办法吗


假设该类是从表单调用的。

捕获一个异常,然后将其吞并,从而颠覆了现有的“中止”机制


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

捕获一个您没有做任何处理的异常并将其吞没,这是在颠覆现有的“中止”机制


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

最简单的解决方法是不捕获异常。如果发生这种情况,它将直接经过
dofuturesanalysis()
函数,然后返回到原始调用方。

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

只要让异常向上传播—只有在您能够实际处理它的情况下,才应该捕获异常。异常是.NET中的“中止机制”。你现在正在吞咽一切都出了问题的信号,然后回来,好像一切都很好


一般来说,我发现捕获异常是非常罕见的——通常是在顶层(阻止整个服务器因为一个请求而停机)或者为了将一种异常转换为另一种异常,以便维护适当的抽象。

让异常向上传播-只有在您能够实际处理它的情况下,才应该捕获异常。异常是.NET中的“中止机制”。你现在正在吞咽一切都出了问题的信号,然后回来,好像一切都很好

一般来说,我发现捕获异常非常罕见——通常是在顶层(阻止整个服务器因为一个请求而停机),或者是为了将一种异常转换为另一种异常,以便维护适当的抽象

我真的希望有一种类似“中止机制”的东西 我可以用。有没有其他办法解决这个问题?任何 这方面有什么有趣的工作吗

是的,有。这称为异常处理

让我们重写您的代码:

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

我真的希望有一种类似“中止机制”的东西 我可以用。有没有其他办法解决这个问题?任何 这方面有什么有趣的工作吗

是的,有。这称为异常处理

让我们重写您的代码:

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
在构造函数中使用try…catch?

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

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

第二,(你会在这里读到很多文章)你如何处理错误实际上取决于你的应用程序和用户的期望。一些错误可以通过更改输入来纠正。如果分析需要很长一段时间,其他人可能会在午夜发生,并且您可能需要继续进行另一个分析,记录此错误。
因此,我认为我们真的要回到您那里,以获得有关上述内容的更多信息。

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

第二,(你会在这里读到很多文章)你如何处理错误实际上取决于你的应用程序和用户的期望。一些错误可以通过更改输入来纠正。如果分析需要很长一段时间,其他人可能会在午夜发生,并且您可能需要继续进行另一个分析,记录此错误。
因此,我认为我们真的要回到您那里,以获取有关上述内容的更多信息。

您只需移动
dodeutheranalysis()编码到try块中

我会这样做的