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

本文关键字:哪一个 if-then-else try-catch 替换 如果 | 更新日期: 2023-09-27 18:32:09

在我的粗略调查中,我认为任何错误都可以通过使用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,推荐哪一个?

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

切勿对控制流使用异常。例外应该是"例外"。如果您知道某些数据验证的规则,则应使用正常的 if/then/elses。

如果您正在执行一些可能以多种方式出错的操作(例如连接到数据库),则应将该操作放入 try-catch 块中并采取相应的操作。

唉,选择将某些东西视为"特殊"取决于设计师的判断。

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

并非所有错误,原因很简单,有一些意外错误,这就是您要使用 try-catch 语句的地方。但是,对可以防止出错的事情使用 try-catch 不是一个好的做法。

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

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

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

因为您不只是想通过简单地将数据喷到控制台来传达错误。 这通常是最后的手段。

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

Howeer,异常有一个特殊的属性,只要它们未被捕获,它们就会继续存在,在调用者链中越来越远,直到处理它们所代表的"信号"错误。

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

上链,传播异常系统提供了一种在编译器中烘焙,语法干净的方式来提供结构化的错误处理

错误代码

或信号也可以用于此目的,但语法上不太流畅,并且在编码中留下了很多痕迹,有很多错误处理代码。 异常会尝试隐藏错误处理,除非绝对必要,否则通过使用编译器和运行时自动跟踪错误代码状态。

您可以同时使用两者。

如果没有 try catch,很难找到您的代码抛出的具体错误。

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");
}

此致敬意

我想

补充另一个重要原因,为什么在 C# 和许多语言中这是不好的做法。

太慢了!

我遇到过这样一种情况,我在早期使用 try catch 进行流量控制,处理 catch 大约需要 15 毫秒,当我将其重写为 if-then 语句时,当它命中 else 时只需要 1 毫秒(捕获)。其他一些语言在尝试捕获方面非常有效,例如 python,并且可以以 C# 永远不应该做的独特方式使用它们。

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 }

在您的情况下,try catch 不会处理与 if 语句相同的逻辑。你只是隐含地假设它确实如此。y == 0 与假设唯一可能发生的错误是 y 为 0 时完全不同。所以基本上程序员不确定是什么可能导致分支代码。另请参阅这篇文章,其中指出,使用 try-catch 进行流量控制违反了"最小惊讶原则":为什么不使用异常作为常规控制流?

块TRY..CATCH不会取代IF.。还!它们是两个不同的东西。

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

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

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

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

另一方面,如果 y 被声明为 int(如您的示例所示),则计算不会出错 (y==0),因此 IF。ELSE 块将被执行。

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

谢谢天际。