我是一名致力于为遗留代码添加新功能的程序员。在调试时,我解析了这个Catch块,它从Visual Studio中得到了一个愤怒的“对象未设置为对象的引用”通知:
catch(Exception ex)
{
SporeLog.Log("Failed to create new SavedDocumentList with Name: " + name, ex);
throw;
}
“扔”是什么意思。我对throw new [exceptiontype]...
很熟悉,但这对于...... throw
是什么意思?
这是一个好的做法,还是应该改变这些代码以简化开发人员对我的试验?
为什么Visual Studio会因此而对我大喊大叫?
答案 0 :(得分:12)
是的,这是一个很好的做法....它的作用是,它重新抛出它捕获的同一个异常,保持堆栈跟踪不变。
答案 1 :(得分:9)
这意味着“重新抛出同样的异常”。换句话说,继续将异常冒泡到下一个try / catch块。
如果您无法在此级别实际处理异常,但希望记录异常发生,则此功能非常有用。
不幸的是,很多人认为“log& rethrow”应该在每个级别完成,导致应用程序运行缓慢,包含多次记录的每个异常的日志文件,并且通常永远不会实际处理异常。
答案 2 :(得分:3)
throw;
重新抛出原始异常。这允许您在当前级别执行某些操作,然后将异常传播到堆栈中。
如果异常是实现细节的结果,那么使用异常链来抛出包含原始异常的特定于域的异常,隐藏客户端实现细节以及过多的异常异常可能更合适要抓住的类型。
如果异常对您的客户有意义,那么重新抛出它就是很好的做法。
答案 3 :(得分:3)
这是一种很好的做法(有时候)。它允许您捕获异常,记录它或确定它是否可以处理,然后重新抛出它而不会丢失StackTrace。
您的NullReferenceException来自SporeLog
null
。