我正在寻找在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 =失败)。但是,我调用的很多方法都使用了返回值。我还可以使用一个在发生错误时被标记的布尔值,并在从构造函数调用下一个方法之前检查该值,但每次检查此值都很烦人且重复。
我真的希望有某种类似我可以使用的“中止机制”。还有其他解决方法吗?对此有任何有趣的解决方法吗?
假设从表单调用此类。
答案 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块
我会在构造函数之外的某个地方完成整个过程。 我在构造函数中所做的只是初始化属性。