首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

DDN 关于 C# throw ex; 与 throw; 的有关问题

2012-02-16 
DDN 关于 C# throw ex 与 throw 的问题~每天一个历史遗留问题~熟悉异常的C++++coder,都知道对于throwex

DDN 关于 C# throw ex; 与 throw; 的问题
~每天一个历史遗留问题~

熟悉异常的   C++++   coder,都知道
对于   throw   ex;   与   throw;   是有区别的,主要是   CLR   确定异常抛出的起点是有区别的,
如果你不清楚请参考:
《.NET   框架程序设计》Jeffery   Richter   李建忠译   chater   18.12   异常堆栈踪迹   P442   的说明

或者见
throw;与throw   ex;之间的区别  
http://blog.csdn.net/Joy_Zhao/archive/2006/10/27/1352777.aspx


但是,下面的   Button1_Click   即使使用   throw;   也堆栈信息只能跟踪到   Line   14   ,始终无法跟踪到   Line   11,而   Button2_Click   直接到   Line   21

//   .aspx.cs
protected   void   Button1_Click(object   sender,   EventArgs   e)
        {
                try   {
                        object   o   =   null;
                        int   i   =   (int)o;     //   Line   11     //   Error,   System.NullReferenceException              
                }
                catch   {
                        throw;   //   Line   14
                }              
        }

        protected   void   Button2_Click(object   sender,   EventArgs   e)
        {
                object   o   =   null;
                int   i   =   (int)o;     //   Line   21     //   Error,   System.NullReferenceException    
        }

//   .aspx
  <asp:Button   ID= "Button1 "   runat= "server "   OnClick= "Button1_Click "   Text= "Throw1 "   />    
                <asp:Button   ID= "Button2 "   runat= "server "   OnClick= "Button2_Click "   Text= "Throw2 "   />    


我做过很多测试了,对于用   try-catch-throw   捕获   CLR   运行时内部抛出的异常,即出现这种情况,始终无法跟踪到最原始的内部异常起点


何解   ?也许是我遗漏了某个知识点~

谢谢!



[解决办法]
sf
[解决办法]
winform测试.
单步可以调试到
int i = (int)o; // Line 11 // Error, System.NullReferenceException

[解决办法]
jf
[解决办法]
关注,此点同样疑问
[解决办法]
没有太多的研究,一直认为只要有throw的语名的行,就是有出错信息的行了。
[解决办法]
//这样就能跟踪到你想要的位置(Line11==Line4);
protected void throwErr()
{
object o = null;
int i = (int)o; //Line4 //Error, System.NullReferenceException


}

protected void Button1_Click(object sender, EventArgs e)
{
try
{
throwErr();
}
catch
{
throw;
}
}

protected void Button2_Click(object sender, EventArgs e)
{
object o = null;
int i = (int)o; // Line 12 // Error, System.NullReferenceException
}
[解决办法]
关注,UP
[解决办法]
太高深了,不明白啊
JF
[解决办法]
关注
[解决办法]
这个到的确是奇怪,有没有在catch那里把异常输出看看堆栈是什么?
[解决办法]
测试无法重现问题,.NET Framework 2.0
[解决办法]
关于异常处理。。一直很让我头疼。。
我只知道
try{}catch(){} 是直接把异常抛出。

try{}catch(Exception ex){}是要先把异常实例化的,这个过程应该是拿到了很确凿的数据,所以这样是可以追踪到出错的位置的,ex.StackTrace 。
所以如果你想追踪异常的原始位置的话,应该写成后者,但这样效率会有所降低。。


[解决办法]
你这个到底是WinForm的还是控制台的?

不过我用两个都测试过了,没有发现你说的问题。
[解决办法]
难不成见鬼了,你把Console的全部代码贴出来。

是.NET Framework 2.0么,说说你的测试环境……
[解决办法]
SQL Helper很垃圾的,推荐你到我的Blog(http://Ivony.cnblogs.com/)上去看看,尽管不知道谁在那里说垃圾,但我想比SQL Helper还是要强一点点的。
[解决办法]
Study~~
[解决办法]
学习!~~
不过,请教下,
try{}catch(){throw;} 与try{}catch(Exception ex){throw ex;}
只是 你所说得 “前者 IL 指令是 rethrow 后者 IL 指令是 throw”的区别吗??

还有,什么都不写 自动有系统踢出不可继续进行的error 和使用try{}catch(){throw;}
有什么区别呢??
[解决办法]
我用.NET 2.0 能重复出LZ的情况. 这里边的问题实际上是Throw不能百分之百保证原始的Stack Trace.

在网上Google了下,这个问题在MS的下边这个Group里讨论过:

microsoft.public.dotnet.languages.csharp

讨论的题目是:

"Bug?! throw vs. throw ex Options "

里边有各种意见,我比较倾向于这是.NET 的一个Bug. 目前的对策也是和LZ一样,重新包装一下Exception以保证Stack Trace显示正确的行号.

热点排行