7

可能重复:
throw 和 throw new Exception() 之间的区别

我是一名程序员,致力于为遗留代码添加新功能。在调试时,我解析了这个 Catch 块,它得到了来自 Visual Studio 的愤怒的“对象未设置为对象的引用”通知:

catch(Exception ex)
            {
                SporeLog.Log("Failed to create new SavedDocumentList with Name: " + name, ex);
                throw;
            }

“扔”是什么意思。我很熟悉,throw new [exceptiontype]...但是……是什么意思throw

这是一种好的做法,还是我应该更改此代码以减轻开发人员在我之后的试验?

为什么 Visual Studio 会因为我这样做而对我大喊大叫?

4

4 回答 4

12

是的,这是一个很好的做法......它所做的是,它重新抛出它捕获的相同异常,保持堆栈跟踪完好无损。

于 2010-07-21T16:34:37.350 回答
9

这意味着“重新抛出同样的异常”。换句话说,继续将异常冒泡到下一个 try/catch 块。

如果您实际上无法在此级别处理异常,但想要记录异常发生,这将很有用。

不幸的是,许多人认为应该在每个级别都进行“记录和重新抛出”,这导致应用程序运行缓慢,每个异常都记录了多次日志文件,并且通常从不实际处理异常。

于 2010-07-21T16:33:51.793 回答
3

throw;重新抛出原始异常。这允许您在当前级别采取一些行动,然后将异常传播到堆栈中。

如果异常是实现细节的结果,则使用异常链来抛出包装原始异常的特定于域的异常可能更合适,以从实现细节中隐藏您的客户端,并捕获过多的不同异常类型.

如果异常对您的客户有意义,那么重新抛出它是一种很好的做法。

于 2010-07-21T16:34:24.787 回答
3

这是一个很好的做法(有时)。它允许您捕获异常、记录它或确定它是否可以处理,然后重新抛出它而不会丢失 StackTrace。

您的 NullReferenceException 来自SporeLognull

于 2010-07-21T16:34:49.093 回答