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