抛出新的异常最佳做法



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

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

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

如果你要抛出一个新的异常,它应该在某些重要方面与原始异常不同。 例如,它应该是另一种类型,或者以某种其他方式(如更具体的错误消息)澄清异常的原因。 如果您不能执行上述任一操作,则只需使用 throw; 重新引发当前异常。

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

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

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

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

这取决于您要做什么。 确切的代码毫无意义,但类似

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

在调试时将有很大帮助。

如果您需要在

重新抛出之前执行异常操作,请执行以下操作:

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

Throw本身只是重新引发当前异常。 如果你不需要在这里处理它,首先不要抓住它。

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

如果代码真的只是:

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

只需删除尝试/捕获,它不会做任何富有成效的事情。 用throw;throw new...更好,但仍然没有生产力。

如果捕获中还有其他事情发生,请按照格罗默的详细信息进行操作,并使用throw;

最新更新