关于c#中的异常的问题

时间:2011-05-07 08:26:52

标签: c# .net exception exception-handling invalidoperationexception

以下是代码段:

class xxx
{

  public xxx(){}

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

任何人都可以告诉这里会引发哪个异常,背后的原因是什么。

7 个答案:

答案 0 :(得分:8)

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

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

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

  3. 始终首先捕获大多数派生的异常类。这意味着您应首先抓住InvalidOperationException尝试抓住Exception之前。您需要反转代码中catch块的顺序。

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

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


  5. 我看到其他答案向您展示了代码应该的样子代码,是否需要重写。我不会这样做,因为如果我重写你的代码是正确的,我最终会这样:

    class Xxx
    {
        public Xxx()
        {
    
        }
    }
    

    不是特别有用。

答案 1 :(得分:2)

如果代码是这样的

 class xxx
    {

      public xxx(){

      try
      {
        throw new Exception(InvalidoperationException);
      }

      catch(InvalidoperationException x)
      {
      }

catch(异常x)           {           }         }         }

它应该编译并引发你的异常并捕获。否则你的代码根本就不会编译。

答案 2 :(得分:1)

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

无论如何 - 几点:

  • 使用异常处理时,将更具体的异常放在不太具体的异常之前(因此InvalidOperationException的标记应该在Exception的标记之前。
  • 捕捉Exception通常没什么用处。
  • 如果您发现异常,请使用它。

你可能意味着:

throw new InvalidOperationException();

但是,您构建例外的方式,catch(Exception x)块将会运行。

答案 3 :(得分: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)将在此处执行。

答案 4 :(得分: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。

答案 5 :(得分:0)

忽略编译问题....第一个匹配的异常块(catch(Exception x))将获得异常。然后你忽略异常并且不重新抛出,所以异常将被外界看到。这并不是一个好的做法,但是......特别是,抓住一个任意的Exception并忽略它是有风险的 - 它可能是任何 ......它不一定你以为是例外。

答案 6 :(得分:0)

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

如果我只看一下这条线:

throw new Exception(InvalidoperationException);

首先,根据MSDN,没有这样的构造函数。所以我假设你的意思是构造函数:Exception(String msg,Exception innerException)。含义:     抛出新的异常(“blabla”,InvalidoperationException);

抛出的异常是 Exception 类型,而不是 InvalidOperationException 。所以 ONLY catch(异常x)可以捕获它。

如果您抛出 InvalidoperationException 而不是编写捕获顺序的方式,那么Exception类将首先被​​捕获 。 渔获量的顺序很重要。

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