如果try-catch可以用if-then-else替换,推荐哪一个?

时间:2013-09-20 04:23:25

标签: c#

在我的粗略调查中,我认为任何错误都可以通过使用if-then-else构造来处理。我们举一个简单的例子如下。

除以零可以用

处理
int x=1;
int y=0;
if(y==0)
    Console.WriteLine("undefined");
else
    Console.WriteLine("x/y={0}",x/y);

替换try-catch等效项

int x=1;
int y=0;
try
{
    Console.WriteLine("x/y={0}",x/y);
}
catch
{
    Console.WriteLine("undefined");
}

如果try-catch可以替换为if-then-else,建议使用哪一个?

10 个答案:

答案 0 :(得分:5)

您永远不应该使用例外来控制流量。 例外应该是"例外"。如果你知道某些数据验证的规则,你应该使用普通的if / then / elses。

如果你正在做一些可能出错的操作(比如连接到数据库),你应该将该操作放入try-catch块并相应地采取行动。

唉,选择将某些东西视为特殊情况"进入设计师的判断。

编辑:另外,不要低估伐木的力量。自从我开始使用日志框架以来,我的调试时间缩短了一半。

答案 1 :(得分:3)

并非所有错误都是因为存在一些意外错误的简单原因,而这就是您要使用try-catch语句的地方。但是,将try-catch用于防止出错的事情并不是一个好习惯。

另外,我只会捕获我知道如何处理或可以处理的异常,否则您将盲目地吞下每个异常,并且您的应用程序将非常难以调试。

但是,如果您不知道如何处理异常但是您知道您的应用程序可以从该部分代码中的错误中恢复并且希望避免您的应用程序因未处理的异常而崩溃,那么它可以很好使用try-catch块,但记录异常细节也是一个好主意。

答案 2 :(得分:1)

块TRY..CATCH不会取代IF..ELSE!它们是两件不同的事情。

TRY..CATCH块捕获错误(如果有的话),而IF..ELSE是一个条件。如果第一个条件为假,它将执行ELSE部分。

然而,最佳做法是使用两者;

try
{
  if(y==0) 
  {
    Console.WriteLine("undefined");
  }
  else
  {
    Console.WriteLine("x/y={0}",x/y);     
  }
}
catch (Exception ex)
{
    Console.WriteLine("Error" + ex);
}

在这种情况下,例如,如果 y 被声明为 日期 ,则条件会抛出错误为(y == 0)将不会被评估。因此将您发送到CATCH,这会引发转换类型错误。

另一方面,如果 y 被声明为 int (如您的示例所示),那么没有错误评估(y == 0),因此,IF..ELSE块将被执行。

答案 3 :(得分:1)

您可以同时使用两者。

如果没有尝试捕获,很难找到代码抛出的具体错误。

try
{
    int x=1;
    int y=0;
    if(y==0)
    Console.WriteLine("undefined");
    else
    Console.WriteLine("x/y={0}",x/y);
}
catch
{
    Console.WriteLine("undefined");
}

最好的问候

答案 4 :(得分:1)

对于异常处理,try-catch块是最有效的方法。在这里你要谈的是一个非常简单和基本的例子,但是当有多个错误或异常可以找到单个表达式时,编程中有很多情况。总是更喜欢使用(try-catch)块而不是检查每个条件。

答案 5 :(得分:1)

因为你不是alawys只是想通过简单地向控制台喷出数据来传达错误。这通常是不得已的过程。

通常,您希望开发一个结构化的错误处理系统。像这样的结构化系统的一个值得注意的特征是能够将错误条件传达给函数或过程的调用者。在这种情况下,如果调用者知道可能存在特殊情况并准备处理来自被调用者的此错误通信,则会这样做。

然而,异常有一个特殊的属性,只要它们没有被捕获它们就会继续存在,进一步支持调用者链直到'信号',它们代表的错误被处理。

很多时候,错误(例外)被捕获并处理(处理)而不向控制台发送任何内容。

上行链接,传播异常系统提供了一种编译时融合,语法清晰的方式来提供结构化的错误处理

错误代码或信号也可用于此目的,但在语法上并不完全平滑,并且在编码中留下了很多痕迹,因为存在大量错误处理代码。除非绝对必要,否则异常会尝试隐藏错误处理,方法是使用编译器和运行时自动跟踪错误代码状态。

答案 6 :(得分:1)

我想在C#和许多语言中添加另一个重要原因,这是不好的做法。

这很慢!

我有一种情况,我早期使用try catch进行流量控制,处理捕获时间大约需要15毫秒,当我将其重新写入if-then语句时,它只需要1毫秒别的(捕获)。其他一些语言在try catch(例如python)上非常有效,并且可以以C#不应该做的独特方式使用它们。

答案 7 :(得分:1)

try catch在大型或小型代码中都很有效,因为当你把你认为可能出错的代码放在这部分代码中时。然后,如果它在运行时发生,您将捕获代码的异常。如果你想运行一行对运行很重要的代码,就像你想调用GC或处理你的内存分配并释放它等等,你可以将这些代码放在finally部分,它完全支持所有类型的代码。一种处理异常的好方法。

try{code that you think maybe error occurred }
catch {if error or exception occurred how handle it }
finally{all code that you want run when program has exception or has not }

答案 8 :(得分:1)

您的案例中的try catch不会处理与if语句相同的逻辑。你只是隐含地假设它。 y == 0与假设唯一可能发生的错误是y为0时完全不同。 所以基本上程序员不确定什么可能导致分支代码。 另见本文,其中指出,使用try-catch进行流量控制违反了“最不惊讶的原则”:Why not use exceptions as regular flow of control?

答案 9 :(得分:-3)

使用Try / Catch块是最好的方法,因为通过异常管理我们可以将这些错误记录到任何文件中,或者我们可以将此异常抛给应用程序中的父函数。此外,任何新的程序员也可以更清楚地理解代码,因为您已经使用了try / catch块。

谢谢, 天际。