Exception对象是否可能由于其内部错误引发另一个异常?
假设在try-catch中我们实例化Exception对象,是否有可能实例化引发另一个异常?如果是的话,我们必须嵌套看起来很有趣的无限try-catch块。
答案 0 :(得分:3)
简而言之,答案是肯定的,这是可能的。
例如 - 如果异常类需要将一个大对象初始化为一个字段,但是没有足够的内存来分配它,你将获得一个抛出OutOfMemoryException
的异常对象。
异常就像任何其他类一样,并且可以自己抛出异常。语言中没有任何东西不允许它。
但是,我会说,从异常类中抛出异常是不好的做法,通常应该避免。
更新:(更新后的问题)
如果要在try
块中实例化异常对象,catch
将捕获它(假设它捕获了适当类型的异常)。如果您在catch
块中实例化它,您可能希望在嵌套的try{}catch{}
中执行此操作 - 对于可能抛出异常的catch块中使用的代码,这是很正常的。
正如其他人所说的那样 - 不应该抓住一些例外(例如OutOfMemory
或意外的StackOverflow
),因为你没有办法处理它们。
答案 1 :(得分:2)
是的 - 当然,异常本身可能会引发异常。
然而,大多数(并非所有)框架异常都是非常轻量级的东西,内部逻辑很少,所以平均异常可能没有很多范围来自己生成异常。 / p>
这是一个框架异常,您是否看到此行为?你能告诉我们一些细节吗?
使用像Reflector这样的工具快速查看异常的内部结构可能会帮助您发现正在发生的事情。
答案 2 :(得分:2)
是的,这可能虽然不是很典型。如果抛出的异常在构造函数中有错误,或者依赖于缺少的类,那么它本身就会抛出异常。
测试这个很容易:创建自己的异常,尝试将方法调用为空引用。实例化异常时,它将抛出NullReferenceException。
答案 3 :(得分:1)
是即可。这是可能的。
但我想知道为什么人们会想要这样做?例外仅仅是为了通过设计实际传达错误,它们不能在其中运行任何可能导致异常的严重代码或逻辑。如果您的参数是,您可能希望将异常记录到数据库或磁盘中,这可能会在某些情况下导致异常,那么我甚至不同意这一点,因为异常应记录在catch
块中
答案 4 :(得分:1)
如果你认为异常对象应该尝试处理这种情况并抛出另一个异常,如果它不可能你是不正确的 catch块应该处理不正确的情况,如果不能这样做,则将异常抛出更远 示例:
try
{
BigResource r = new BigResource();
}
catch(BigResourceException e)
{
bool cannotHandle = false;
// Handle exception here
if (cannotHandle)
throw e;
}