首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么异常的行号指向抛出语句?

为什么异常的行号指向抛出语句?
EN

Stack Overflow用户
提问于 2015-06-11 20:29:15
回答 2查看 236关注 0票数 1

假设我有以下构造:

代码语言:javascript
复制
Try 
  Dim f As FileInfo = Nothing
  f.Delete()

  ... some other stuff...
Catch ex as Exception
   Throw
End Try

在这个简单的例子中,f.Delete会抛出一个NullReferenceException。

  1. 为什么这个异常的StackTrace中的问题行指向Throw语句而不是f.Delete()行?
  2. 如何保留Try/Catch,但将正确的堆栈跟踪指向f.Delete()作为问题的来源?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-11 20:32:52

1.为什么这个异常的StackTrace中的问题行指向抛出语句而不是f.Delete()行?

这取决于您正在查看的堆栈跟踪:由重新抛出(在catch块中的Throw )生成的跟踪,还是通过捕获第一个异常生成的跟踪?

Catch ex As Exception行上设置一个断点,并使用调试器检查ex;您将看到指向f.Delete()的堆栈跟踪。

Throw的意思是“重新抛出”,即原始堆栈跟踪将被保留.但是,对于相同的方法调用,您不会在堆栈跟踪中获得两个条目:如果异常在最初导致异常的同一方法中被重新抛出,堆栈跟踪将只包含指向最终重抛.的条目。

2.如何保持Try/Catch,但将正确的堆栈跟踪指向f.Delete()作为问题的来源?

  1. 记住,重新抛出基本上意味着,“我错了,我不知道怎么处理这个异常。”因此,您可以使用异常筛选器(Catch … When <boolean-expression>)来决定是否能够在捕获异常之前实际处理异常,而不是重新抛出。如果您能够确定在捕获它之前,重新抛出应该是不必要的,并且堆栈跟踪不会被修改。
  2. f.Delete()放在另一种方法中。这样,它就可以在堆栈跟踪中获得自己的堆栈帧/行,并且不会被重新Throw覆盖。

(或者,不要仅仅为了重新抛出而捕获异常。)

票数 2
EN

Stack Overflow用户

发布于 2015-06-11 21:31:27

我想这也能给出正确的异常(至少在“内部”异常中是这样):

代码语言:javascript
复制
Try 
  Dim f As FileInfo = Nothing
  f.Delete()

  ... some other stuff...
Catch ex as Exception
   Throw New Exception("Failed in Method X", ex)
End Try
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30790829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档