抛出新的例外最佳实践

时间:2012-10-11 20:06:19

标签: c# .net exception exception-handling

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

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

5 个答案:

答案 0 :(得分:17)

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

如果您要抛出一个新的异常,它应该以某种显着的方式与原始异常不同。例如,它应该是另一种类型,或者以某种其他方式(如更具体的错误消息)澄清异常的原因。如果你不能做其中任何一件事,那么只需使用throw;重新抛出当前的异常。

或者,更好的是,根本不要抓住它。 Rethrowing实际上也会混淆堆栈跟踪(当前帧的错误位置设置为重新抛出点而不是发生异常的位置),所以如果你没有任何东西,你个人必须要处理异常,然后放手 - 让它传播并让调用者处理它。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:2)

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

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

在调试时会有很大帮助。

答案 3 :(得分:1)

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

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

Throw本身只是重新抛出当前异常。如果您不需要在这里处理它,请不要在第一时间捕获它。

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

答案 4 :(得分:0)

如果代码真的只是:

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

只需删除try / catch,它就没有做任何有效的工作。与throw;交换throw new... 更好,但效率仍然不高。

如果catch中还有其他内容,请按Gromer详细信息进行操作,然后使用throw;