2

以下是良好的做法吗?如果不是,应该怎么做?

catch(Exception e)
{
     throw new Exception(e.Message, e);
}
4

5 回答 5

18

不,如果您使用相同的消息引发另一个完全相同类型的异常,这不是一个好习惯。这样做会使堆栈跟踪复杂化,并使调试更加痛苦。

如果你要抛出一个新的异常,它应该与原来的有一些显着的不同。例如,它应该是另一种类型,或者以其他方式(如更具体的错误消息)阐明异常的原因。如果您不能做任何这些事情,那么只需使用throw;.

或者,更好的是,根本不要抓住它。重新抛出实际上也会稍微弄乱堆栈跟踪(当前帧的错误位置设置为重新抛出点,而不是发生异常的位置),所以如果你没有任何事情需要你亲自处理异常,然后放手——让它传播并让调用者处理它。

于 2012-10-11T20:07:44.177 回答
4

只需重新抛出捕获的异常,无需创建新异常。

catch(Exception e)
{
    // Do some logging...
    throw;
}

一些关于重新抛出异常和对其堆栈跟踪的影响的阅读:http: //msdn.microsoft.com/en-us/library/ms182363 (v=vs.100).aspx

于 2012-10-11T20:08:24.717 回答
2

这取决于你想要做什么。那个确切的代码是没有意义的,但是像

catch(Exception ex)
{
    throw new ApplicationSpecificException("Error while doing something specific: " + contextualData, ex);
}

在调试时将有很大帮助。

于 2012-10-11T20:11:38.853 回答
1

如果您需要在重新抛出异常之前对其进行处理,请执行以下操作:

catch(Exception e)
{
     // Additional handling here
     throw;
}

Throw本身只是重新抛出当前异常。如果您不需要在这里处理它,请不要一开始就抓住它。

此外,在您的示例中,您正在捕获任何类型的异常,但在其位置抛出了一个泛型Exception- 可能不是很有用。

于 2012-10-11T20:12:27.943 回答
0

如果代码真的只是:

try
{
  // something
}
catch(Exception e)
{
  throw new Exception(e.Message, e);
}

只需删除 try/catch,它不会做任何有成效的事情。交换throw;更好throw new...但仍然没有生产力。

如果还有其他事情发生,请按照 Gromer 的详细信息进行操作,然后使用throw;

于 2012-10-11T20:18:49.570 回答