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