在catchblock中使用“Throw”(没有别的!)

时间:2010-07-21 16:30:21

标签: c# visual-studio-2008 try-catch throw

  

可能重复:
  difference between throw and 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 个答案:

答案 0 :(得分:12)

是的,这是一个很好的做法....它的作用是,它重新抛出它捕获的同一个异常,保持堆栈跟踪不变。

答案 1 :(得分:9)

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

如果您无法在此级别实际处理异常,但希望记录异常发生,则此功能非常有用。

不幸的是,很多人认为“log& rethrow”应该在每个级别完成,导致应用程序运行缓慢,包含多次记录的每个异常的日志文件,并且通常永远不会实际处理异常。

答案 2 :(得分:3)

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

如果异常是实现细节的结果,那么使用异常链来抛出包含原始异常的特定于域的异常,隐藏客户端实现细节以及过多的异常异常可能更合适要抓住的类型。

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

答案 3 :(得分:3)

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

您的NullReferenceException来自SporeLog null