在 try 块中抛出异常有什么问题吗?

本文关键字:什么 问题 抛出异常 try | 更新日期: 2023-09-27 18:34:04

如下方式编写try-catch块是一种良好的设计实践吗?也就是说,在 try 块中使用throw,然后在 catch 块中捕获它。

try
{
  if (someCondition){
      throw new Exception("Go the the associated catch block!");
     }
}
catch(Exception ex)
{
      logError("I was thrown in the try block above");
}

在 try 块中抛出异常有什么问题吗?

有时你可能想要 - 例如,如果你正在使用 ado.net,它习惯于将所有东西都作为SqlException扔掉 - 你可能想抓住其中的一些,并处理它们,同时将其他的处理留给另一个层次。在这种情况下,您必须捕获 SqlException,看看是否可以处理它,如果不能,则重新抛出它。

例外情况适用于例外情况。它不应该用作流逻辑的控制,但如果有一个边缘情况需要处理,如果它确实出现,那么这样做并没有错。

如果我正在读取的数据不是我所期望的,我自己在我的代码中抛出一个 InvalidDataException。

一般来说,如果它是最短的可写方法,那么设计还不错。但请注意,抛出一个字幕通常需要大约 1 毫秒才能捕捉到。在这方面,这是一个性能问题。

这取决于,您应该在通常的情况下抛出异常,并且最好是您自己的异常而不是一般异常。

这完全取决于您要实现的目标。总的来说,最好避免过度使用try-catch块,尤其是因为它们很慢。许多 try-catch 块会使您的代码看起来混乱且难以遵循。

您需要考虑为什么会引发异常,是意外错误、错误还是预期错误?如果这是一个预期的错误,那么你应该尝试绕过它,而不使用 try-catch。

如果 someCondition 表示真正的错误状态,那么是的。这没有问题。但是,请不要使用它来控制程序流。没有什么比看到可以退出范围时抛出的异常更让我抓狂的了。它还有可能损害代码中实际异常的正确处理。