2

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

4

10 回答 10

5

您永远不应该使用异常来进行控制流。例外应该是“例外”。如果你知道一些数据验证的规则,你应该使用普通的 if/then/elses。

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

唉,将某些东西视为“特殊”的选择进入了设计师的判断。

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

于 2013-09-20T04:34:38.460 回答
3

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

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

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

于 2013-09-20T04:27:58.477 回答
1

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

于 2013-09-20T04:30:44.667 回答
1

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

于 2013-09-20T06:28:04.813 回答
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 }
于 2013-09-20T05:08:45.713 回答
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声明为Date,则条件将引发错误,因为 (y==0) 不会被评估。因此将您发送到 CATCH,这将引发转换类型错误。

另一方面,如果y被声明为int(如在您的示例中),则不会出现错误评估 (y==0),因此将执行 IF..ELSE 块。

于 2013-09-20T04:26:55.623 回答
1

您可以同时使用两者。

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

此致

于 2013-09-20T04:28:34.707 回答
1

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

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

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

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

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

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

于 2013-09-20T04:36:26.470 回答
1

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

很慢!

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

于 2013-09-20T04:42:08.980 回答
-3

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

谢谢,天际。

于 2013-09-20T06:47:38.120 回答