以下是代码片段:
class xxx
{
public xxx(){}
try
{
throw new Exception(InvalidoperationException);
}
catch(Exception x)
{
}
catch(InvalidoperationException x)
{
}
}
谁能告诉这里会引发哪个异常以及它背后的原因是什么。
以下是代码片段:
class xxx
{
public xxx(){}
try
{
throw new Exception(InvalidoperationException);
}
catch(Exception x)
{
}
catch(InvalidoperationException x)
{
}
}
谁能告诉这里会引发哪个异常以及它背后的原因是什么。
哇,这里有很多问题。从哪儿开始?
该代码不会编译。您定义的try-catch
块在任何方法之外,这是不允许的。您需要将其移动到方法中。
永远不要抛出您打算稍后在方法中捕获的方法。这通常称为对“流控制”使用异常,这是完全不鼓励的。这样做会带来性能成本,并且当您有代码抛出和捕获自己的异常时,监视使用调试器时抛出的异常也会变得非常混乱。如有必要,使用布尔变量(称为标志)进行流量控制。
始终首先捕获派生最多的异常类。这意味着您应该InvalidOperationException
先 catch,然后再尝试 catch Exception
。您需要catch
在您拥有的代码中反转块的顺序。
你几乎不应该抓住System.Exception
. 您应该捕获的唯一异常是那些您明确理解并且能够处理的异常。当您拥有的唯一信息是引发了一般异常时,您几乎无法知道出了什么问题或如何处理它。
按照同样的思路,你也不应该从你自己的代码中抛出这个异常。选择一个从基类继承的更具描述性的异常类System.Exception
,或者通过从基类继承来创建自己的异常类。
我看到其他答案正在向您展示您的代码应该是什么样子的示例代码,如果它被重写。我不会那样做,因为如果我重写你的代码是正确的,我最终会得到这个:
class Xxx
{
public Xxx()
{
}
}
不是特别有帮助。
如果代码是这样的
class xxx
{
public xxx(){
try
{
throw new Exception(InvalidoperationException);
}
catch(InvalidoperationException x)
{
}
捕获(异常 x){ } } }
它应该编译并引发您的异常并捕获。否则,您的代码将根本无法编译。
没有。它不会编译。因此,毫无疑问将生成哪个异常。
你的代码应该是这样的:
class xxx
{
public void Test()
{
try
{
throw new InvalidoperationException();
}
catch(InvalidoperationException exception)
{
// Something about InvalidOperationException;
}
catch(Exception exception)
{
// Something about the Exception
}
}
}
需要注意的一点:
不会抛出异常,因为此代码甚至不会编译。
无论如何 - 几点:
InvalidOperationException
应该在 for 之前Exception
)。Exception
通常不是很有用。你可能的意思是:
throw new InvalidOperationException();
但是,按照您构建异常的方式,该catch(Exception x)
块将运行。
你应该写:
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)
会在这里执行。
忽略编译问题......第一个匹配的异常块(catch(Exception x)
)将获得异常。然后您忽略异常并且不重新抛出,因此外部世界将看到异常。但是,这并不是一种好的做法……特别是,捕捉任意Exception
并忽略它是有风险的——它可能是任何东西……它不一定是你认为的例外。
好吧,代码不会编译,但我会忽略它......
如果我只看这条线:
throw new Exception(InvalidoperationException);
首先,根据 MSDN,没有这样的构造函数。所以我假设你的意思是构造函数:Exception(String msg, Exception innerException)。含义: throw new Exception("blabla", InvalidoperationException);
抛出的异常是Exception类型而不是InvalidOperationException。所以只有 catch(Exception x) 可以抓住它。
如果您抛出InvalidoperationException的方式比编写捕获顺序的方式不同,则 Exception 类将首先被捕获。捕获的顺序确实很重要。
我能给你的最好建议就是自己尝试一下,看看会发生什么。