-1

以下是代码片段:

class xxx
{

  public xxx(){}

  try
  {
    throw new Exception(InvalidoperationException);
  }
  catch(Exception x)
  {
  }
  catch(InvalidoperationException x)
  {
  }
}

谁能告诉这里会引发哪个异常以及它背后的原因是什么。

4

7 回答 7

8

哇,这里有很多问题。从哪儿开始?

  1. 该代码不会编译。您定义的try-catch块在任何方法之外,这是不允许的。您需要将其移动到方法中。

  2. 永远不要抛出您打算稍后在方法中捕获的方法。这通常称为对“流控制”使用异常,这是完全不鼓励的。这样做会带来性能成本,并且当您有代码抛出和捕获自己的异常时,监视使用调试器时抛出的异常也会变得非常混乱。如有必要,使用布尔变量(称为标志)进行流量控制。

  3. 始终首先捕获派生最多的异常类。这意味着您应该InvalidOperationException先 catch,然后再尝试 catch Exception。您需要catch在您拥有的代码中反转块的顺序。

  4. 你几乎应该抓住System.Exception. 您应该捕获的唯一异常是那些您明确理解并且能够处理的异常。当您拥有的唯一信息是引发了一般异常时,您几乎无法知道出了什么问题或如何处理它。

    按照同样的思路,你也不应该你自己的代码中抛出这个异常。选择一个从基类继承的更具描述性的异常类System.Exception,或者通过从基类继承来创建自己的异常类。


我看到其他答案正在向您展示您的代码应该是什么样子的示例代码,如果它被重写。我不会那样做,因为如果我重写你的代码是正确的,我最终会得到这个:

class Xxx
{
    public Xxx()
    {

    }
}

不是特别有帮助。

于 2011-05-07T08:39:43.137 回答
2

如果代码是这样的

 class xxx
    {

      public xxx(){

      try
      {
        throw new Exception(InvalidoperationException);
      }

      catch(InvalidoperationException x)
      {
      }

捕获(异常 x){ } } }

它应该编译并引发您的异常并捕获。否则,您的代码将根本无法编译。

于 2011-05-07T08:35:18.830 回答
1

没有。它不会编译。因此,毫无疑问将生成哪个异常。

你的代码应该是这样的:

class xxx
{
    public void Test()
    {
        try
        {
          throw new InvalidoperationException(); 
        }
        catch(InvalidoperationException exception)
        {
            // Something about InvalidOperationException;
        }            
        catch(Exception exception)
        {
            // Something about the Exception
        }
    } 
}

需要注意的一点:

  1. 首先编写更具体的 Exception 类,因此我们在 Exception 类之前编写 InvalidOperationException。
于 2011-05-07T08:37:24.347 回答
1

不会抛出异常,因为此代码甚至不会编译。

无论如何 - 几点:

  • 使用异常处理时,将更具体的异常放在不太具体的异常之前(因此 catchInvalidOperationException应该在 for 之前Exception)。
  • 捕捉Exception通常不是很有用。
  • 如果您捕获到异常,请对其进行处理。

你可能的意思是:

throw new InvalidOperationException();

但是,按照您构建异常的方式,该catch(Exception x)块将运行。

于 2011-05-07T08:29:27.047 回答
1

你应该写:

class xxx
{
    public void Test()
    {
        try
        {
          throw new InvalidoperationException(); 
        }
        catch(InvalidoperationException exception)
        {
            // Do smth with exception;
        }            
        catch(Exception exception)
        {
            throw; // Rethrows your exception;
        }
    } 
}

InvalidOperationException继承自Exceptioncatch试图处理最具体的分支,所以catch (InvalidOperationException x)会在这里执行。

于 2011-05-07T08:34:12.167 回答
0

忽略编译问题......第一个匹配的异常块(catch(Exception x))将获得异常。然后您忽略异常并且不重新抛出,因此外部世界将看到异常。但是,这并不是一种好的做法……特别是,捕捉任意Exception并忽略它是有风险的——它可能是任何东西……它不一定是你认为的例外。

于 2011-05-07T08:40:15.517 回答
0

好吧,代码不会编译,但我会忽略它......

如果我只看这条线:

throw new Exception(InvalidoperationException);

首先,根据 MSDN,没有这样的构造函数。所以我假设你的意思是构造函数:Exception(String msg, Exception innerException)。含义: throw new Exception("blabla", InvalidoperationException);

抛出的异常是Exception类型而不是InvalidOperationException。所以只有 catch(Exception x) 可以抓住它。

如果您抛出InvalidoperationException的方式比编写捕获顺序的方式不同,则 Exception 类将首先被​​捕获。捕获的顺序确实很重要。

我能给你的最好建议就是自己尝试一下,看看会发生什么。

于 2011-05-07T08:44:31.627 回答