以下是代码段:
class xxx
{
public xxx(){}
try
{
throw new Exception(InvalidoperationException);
}
catch(Exception x)
{
}
catch(InvalidoperationException x)
{
}
}
任何人都可以告诉这里会引发哪个异常,背后的原因是什么。
答案 0 :(得分:8)
该代码无法编译。您定义的try-catch
块不在任何方法之外,这是不允许的。您需要将内部移动到方法中。
永远不要抛出您打算在方法中稍后抓住自己的方法。这通常被称为使用“流量控制”的例外,这是完全不鼓励的。这样做会产生性能成本,并且当您拥有抛出并捕获它自己的异常的代码时,监视使用调试器时抛出的异常也会非常混乱。如有必要,使用布尔变量(称为标志)进行流控制。
始终首先捕获大多数派生的异常类。这意味着您应首先抓住InvalidOperationException
,尝试抓住Exception
之前。您需要反转代码中catch
块的顺序。
你几乎永远不会抓住System.Exception
。您应该捕获的唯一例外是您明确理解并且能够处理的那些例外。当您获得的唯一信息是抛出一般异常时,您几乎无法知道出了什么问题或如何处理它。
同样,你也应该从不从你自己的代码中抛出这个异常。选择一个从基础System.Exception
类继承的更具描述性的异常类,或者通过从类继承来创建自己的类。
我看到其他答案向您展示了代码应该的样子代码,是否需要重写。我不会这样做,因为如果我重写你的代码是正确的,我最终会这样:
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
继承自Exception
。
catch
尝试处理最具体的分支,因此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
}
}
}
需要注意的一点:
答案 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类将首先被捕获 。 渔获量的顺序很重要。
我能给你的最好建议就是自己尝试,看看会发生什么。